ActiveRecord 夹具的日期时间字符串格式(非Rails)
Datetime string format for ActiveRecord fixture (non-Rails)
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
才能得到它?
看起来这不是 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,你有责任确保你的日期在进入数据库之前都一致地转换为一个时区。
格式是这样的: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')
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
才能得到它?
看起来这不是 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,你有责任确保你的日期在进入数据库之前都一致地转换为一个时区。
格式是这样的: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')