gpt4 book ai didi

ruby-on-rails - 如何在 Rails 中设置日期时间格式

转载 作者:行者123 更新时间:2023-12-04 06:41:40 26 4
gpt4 key购买 nike

我正在使用一个 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'

它最终为空(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。

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

最佳答案

ActiveRecord 以 UTC+00:00 存储日期/时间。如果您住在 +5 区,ActiveRecord 会自动减去 5 小时的分配时间。因此,您当前的时区只是表示必须从您的本地时间中添加/减去多少小时。

关于解析。您是否尝试过以下操作?

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

Rails 时间/日期设置是为了展示,而不是为了分配。从用户那里获取字符串并将它们分配给您的日期/时间属性并不是一个绝妙的主意。你最好在赋值中使用适当的时间对象而不是 stings。如果某些用户试图成为黑客,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:国际化

找到您的 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

关于ruby-on-rails - 如何在 Rails 中设置日期时间格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10894851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com