ActiveRecord fixture的日期时间字符串格式(非Rails)

时间:2015-08-14 23:15:00

标签: ruby datetime activerecord fixtures

Rails显然提供了Time.to_s的扩展,允许您以数据库友好的方式格式化时间戳,例如Time.now.to_s(:db)。这可以在ActiveRecord动态夹具中使用:

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 个答案:

答案 0 :(得分: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&#39; 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,它确保您的日期在进入数据库之前始终一致转换为一个时区。