2008-11-26 31 views
1

我將environment.rb中的config.time_zone設置爲「UTC」,當我發出「select now(); mySQL服務器返回當地時區的當前時間」並在utc中請求「select utc_timestamp;」Ruby on Rails:當我給DB寫入時間時,爲什麼我的時間區域會變得冗長,然後再讀回來?

我正在運行rails 2.1.2,mysql gem 2.7.3,activerecord gem 2.1.2和mysql --version返回「Ver 14.12 Distrib 5.0.27 for Win32(ia32)」。

編輯:我的environment.rb設置爲UTC,並且自從我開始項目以來。服務器重啓將不會改變。

record = Record.find(:first) 
puts Time.now 
# Tue Nov 25 17:40:48 -0800 2008 
record.time_column = Time.now 
record.save 

mysql> select * from records; 
--------------------- 
2008-11-26 01:40:48 

#note that this is the same time, in UTC. 

record = Record.find(:first) 
puts record.time_column 
Wed Nov 26 01:40:48 -0800 2008 

#NOTE that this is eight hours in advance! 
#All I've done is store a date in the database and retrieve it again! 

任何想法是什麼原因造成的?

回答

5

關於日期,時區和MySQL我們有同樣的問題。後者假定您在配置的時區中爲其提供日期/時間值。

但是,由於您將Rails配置爲使用UTC來處理時間,因此ActiveRecord會將UTC中的任何日期/時間值轉換(因此,2008年11月25日17:40:48 -0800變爲Wed Nov 26 01:40:48 0000 2008)在使用SQL更新/創建查詢中的值之前,它會生成併發送到MySQL。

在這被認爲是2008-11-26 1時四十零分48秒-0800由MySQL僞代碼

("time = %t", Tue Nov 25 17:40:48 -0800 2008) => "time = '2008-11-26 01:40:48' 

看看你的調試日誌文件,你會明白我的意思。它可以正常工作的唯一方式(意思是沒有什麼意外)是通過在Rails和MySQL中設置相同的時區,這個時區是UTC。這是我們使用的配置。

0

在編輯environment.rb文件之後,您是否在向數據庫創建新記錄之前重新啓動服務器?

1

不是你可能想要的答案,但我發現獲得一致時間的關鍵是處理Rails領域中所有基於時區的邏輯並保持數據庫的愚蠢。

這回到了rails 2.0,其中時區/ utc的實現是令人難以置信的錯誤/破壞,所以現在可能會更好。

相關問題