2012-06-05 55 views
3

我正在使用js日曆,它將字符串插入文本字段以提交作爲日期時間值。不知道它是否重要,但現在我正在使用SQLite。如何在Rails中設置日期時間格式

我設置的格式如下(以初始化):

Time::DATE_FORMATS[:default] = '%m/%d/%Y %H:%M' 
Time::DATE_FORMATS[:db] = '%m/%d/%Y %H:%M' 

這是行不通的,因爲Rails的顯然是驗證使用不同格式的日期。

例如,如果我將其設置如下:

myobject.my_datetime = '06/30/2012 00:00' 

它最終爲空(本身由ActiveRecord的生成的SQL查詢其設置爲NULL)。如果我將它設置爲小於或等於12的日期,則日期部分結束正確(但生成的SQL查詢仍然在月份前一天顯示字符串,即在上面的示例中,SQL查詢的字符串爲'30/06/2012 05:00:000000')。

正如你所看到的,即使我將config.time_zone設置爲東部時間,它似乎也會爲UTC(?)增加5個小時。

無論從控制檯還是通過表單提交,行爲都是相同的。

關於我失蹤的任何建議?

UPDATE:

當我遵循JDOE的建議,這樣做:

myobject.my_datetime = Time.strptime('06 /二千〇十二分之三十〇08:00' ,「%M /%d /% Y%H:%M')

生成的查詢現在看起來是正確的(忽略4個小時的時差):

UPDATE "myjoin_table" SET "my_datetime" = '06/30/2012 04:00.000000' ..... 

,並在數據庫中那樣捲起。

但是,當我重新加載對象時,AR對象中的值被初始化爲零。

我想我只是在我的控制器操作中逐一解析字符串,並手動將參數設置爲update_attributes。這比它應該更難。

回答

6

ActiveRecord以UTC + 00:00存儲日期/時間。如果您生活在+5區域,ActiveRecord會在自動分配時減去5小時。所以,你現在的時區只是說你必須在當地時間增加/減少多少小時。

關於解析。你嘗試了以下嗎?

myobject.my_datetime = Time.strptime('06/30/2012 00:00', '%m/%d/%Y %H:%M') 

Rails時間/日期設置用於顯示,而不是分配。從用戶獲取字符串並將它們分配給日期/時間屬性並不是一個好主意。你最好在分配中使用適當的時間對象而不是叮咬。如果某個用戶試圖成爲黑客,則strptime方法將提高ArgumentError。你的record.date_time='string'默默地失敗。


UPD:使用實施例

p = Product.first 
p.last_visited = Time.strptime('06/30/2012 00:00', '%m/%d/%Y %H:%M') 
p.save # leads to UPDATE "products" SET "last_visited" = '2012-06-29 21:00:00.000000' 
Product.last_visited.localtime.strftime('%m/%d/%Y %H:%M') # => "06/30/2012 00:00" 

正如所看到的,時間被存儲和檢索的W/O型的任何問題。

UPD 2:的I18n

找到您config/locales/en.yml。以下內容添加到它:

en: 
    time: 
    formats: 
     default: '%m/%d/%Y %H:%M' 

要分析你的時間使用t(或translate)幫手:

= l @time 

@time = Time.strptime('06/30/2012 00:00', t('time.formats.default')) 

使用l(或localize)輔助您的格式顯示時間

+0

我現在得到的配置設置僅用於顯示。我沒有收到用戶的字符串。我只包含足夠的信息來描述問題,通過傳遞一個類似於我的表單正在執行的字符串(續),可以在控制檯上重現此問題。 –

+0

請參閱問題更新。 –

+0

@KenThompson查看UPD的使用示例。 – jdoe

相關問題