【问题标题】:Datetime string format for ActiveRecord fixture (non-Rails)ActiveRecord 夹具的日期时间字符串格式(非 Rails)
【发布时间】:2015-08-14 23:15:00
【问题描述】:

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 来获取它吗?

【问题讨论】:

    标签: ruby datetime activerecord fixtures


    【解决方案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')
    

    【讨论】:

      【解决方案2】:

      看起来这不是 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,您有责任确保您的日期在进入数据库之前始终转换为一个时区。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        • 2014-08-10
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多