3

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

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

4

1 回答 1

7

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

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

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

Rails 时间/日期设置是为了显示,而不是为了分配。从用户那里获取字符串并将它们分配给您的日期/时间属性并不是一个好主意。您最好在分配中使用适当的时间对象而不是刺痛。如果某些用户试图成为黑客,该strptime方法将引发。ArgumentErrorrecord.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
于 2012-06-05T10:59:17.267 回答