2015-08-14 72 views
0

的Rails顯然提供了一個擴展到Time.to_s允許格式化數據庫中的友好的方式,例如時間戳Time.now.to_s(:db)。這可以在一個ActiveRecord的動態夾具使用:ActiveRecord的夾具(非Rails)的日期時間字符串格式

my_record: 
    some_datetime: <%= Time.utc(2015, 1, 1).to_s(:db) %> 

然而,外面的Rails,這將失敗,並

ArgumentError: wrong number of arguments (1 for 0) 
    (...) in `to_s' 

如果我要用手將時間轉換,是什麼格式(與時區等)我應該在這裏使用?

或者,如果我錯了,它不是Rails,但在ActiveRecord中添加了此擴展的某些內容,需要什麼require才能得到它?

回答

1

格式是這樣的:YYYY-MM-DD HH-MM-SS

另一種方式來獲得這種格式是由strftime:

DateTime.now.strftime('%Y-%m-%d %I:%M:%S') 

如果你想包括時區,添加% z:

DateTime.now.strftime('%Y-%m-%d %I:%M:%S %z') 
1

看起來這不是一個Rails的功能,而是一個功能的ActiveSupport。它應該在開箱即用的燈具中正常工作;在例如IRB你需要require 'active_support/time'

$ irb 
2.2.2 :001 > Time.utc(2015, 7, 1, 10, 5).to_s(:db) 
ArgumentError: wrong number of arguments (1 for 0) 
    from (irb):1:in `to_s' 
    from (irb):1 
    from /Users/dmoles/.rvm/rubies/ruby-2.2.2/bin/irb:11:in `<main>' 
2.2.2 :002 > require 'active_support/time' 
=> true 
2.2.2 :003 > Time.utc(2015, 7, 1, 10, 5).to_s(:db) 
=> "2015-07-01 10:05:00" 

但是請注意,這將下降時區信息:

2.2.2 :004 > Time.now.to_s(:db) 
=> "2015-08-14 16:21:47" 

而且的ActiveSupport的TimeWithZone沒有幫助:

$ irb 
2.2.2 :001 > require 'active_support/time' 
=> true 
2.2.2 :002 > time_now = Time.now 
=> 2015-08-14 16:31:31 -0700 
2.2.2 :003 > time_now_utc = time_now.utc 
=> 2015-08-14 23:31:31 UTC 
2.2.2 :004 > time_now_with_zone = Time.now.in_time_zone 
=> 2015-08-14 16:31:58 -0700 
2.2.2 :005 > time_now_utc_with_zone = time_now_utc.in_time_zone 
=> 2015-08-14 23:31:31 UTC 
2.2.2 :006 > time_now_with_zone.to_s(:db) 
=> "2015-08-14 16:31:58" 
2.2.2 :007 > time_now_utc_with_zone.to_s(:db) 
=> "2015-08-14 23:31:31" 

At least in SQLite,這是你要確保你的日期在進入數據庫之前都會一直轉換爲一個時區。

+1

看起來你已經弄明白了:-) –