【问题标题】:How to set datetime format in Rails如何在 Rails 中设置日期时间格式
【发布时间】:2012-06-05 09:32:28
【问题描述】:

我正在使用一个 js 日历,它将一个字符串插入一个文本字段以作为日期时间值提交。不确定这是否重要,但我现在正在使用 SQLite。

我将格式设置如下(在初始化程序中):

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'

它以 null 结束(ActiveRecord 生成的 SQL 查询本身将其设置为 NULL)。如果我将其设置为小于或等于 12 的日期,则日期部分最终正确(但生成的 SQL 查询仍显示该月前一天的字符串,即在上面的示例中,SQL 查询的字符串为 '30 /06/2012 05:00:000000')。

如您所见,即使我将 config.time_zone 设置为东部时间,它似乎也为 UTC(?)增加了 5 小时。

无论从控制台还是通过表单提交,行为都是相同的。

对我缺少什么有什么建议吗?

更新:

当我按照 jdoe 的建议这样做时:

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

现在生成的查询看起来是正确的(忽略 4 小时的差异):

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

它以这种方式在数据库中结束。

但是当我重新加载对象时,AR 对象中的值被初始化为 nil。

我想我会在我的控制器操作中逐个解析字符串并手动将参数设置为 update_attributes。这比它应该的更难。

【问题讨论】:

    标签: ruby-on-rails datetime activerecord


    【解决方案1】:

    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"
    

    如您所见,时间的存储和检索没有任何问题。

    UPD 2:I18n

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

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

    要解析您的时间,请使用 t(或 translate) 助手:

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

    使用l(或localize)助手以您的格式显示时间:

    = l @time
    

    【讨论】:

    • 我现在知道配置设置仅用于显示。我没有从用户那里得到字符串。我只包含了足够的信息来描述问题,可以通过传递类似于我的表单执行方式的字符串在控制台上重现(续)。
    • @KenThompson 有关用法示例,请参阅 UPD。
    • 我在你的例子中这样做(除了没有本地时间转换,因为我在我的 application.rb 中设置时区)。问题是我原始问题中的第二种初始化格式(':db')。不知何故,这一切都搞砸了。谢谢。
    • @KenThompson 您是否考虑过使用 Rails 指定格式的方式?请参阅我的 UPD 2。
    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2011-09-22
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    相关资源
    最近更新 更多