【发布时间】:2012-05-18 13:52:09
【问题描述】:
在 Rails 中,我发现我有几个选项可以解析日期和日期时间。仅出于通过 ActiveRecord 将日期持久保存到数据库中的目的而解析日期的最佳做法是什么?为什么?
Time.zone.parse(...)
Time.parse(...)
DateTime.parse(...)
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3
在 Rails 中,我发现我有几个选项可以解析日期和日期时间。仅出于通过 ActiveRecord 将日期持久保存到数据库中的目的而解析日期的最佳做法是什么?为什么?
Time.zone.parse(...)
Time.parse(...)
DateTime.parse(...)
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3
如果您只想写入 ActiveRecord,请使用 Time.zone.parse。
应避免使用日期时间。如果您正在处理日期,则应使用 Date.parse。
除此之外,这取决于输入是否带有时区信息、当前时区设置为什么以及您是否希望数据中包含时区。
Time.zone.parse 将返回一个 ActiveSupport::TimeWithZone,默认为 UTC。
> Time.zone.parse("12:30")
=> Thu, 10 May 2012 12:30:00 UTC +00:00
Time.parse 将返回一个时间,如果它在输入中指定,则带有一个区域,或本地 TZ。
> Time.parse("12:30")
=> 2012-05-09 12:30:00 -0700
有关 Ruby 时间比较和精度的更详细说明,请阅读这篇博文:
http://blog.solanolabs.com/rails-time-comparisons-devil-details-etc/
【讨论】:
Time.zone.parse 正确采用了 rails 默认区域,而 DateTime 返回 UTC。所以+1,但是“应该避免日期时间”还有其他原因吗?
由 ActiveRecord 自动设置的时间(例如 created_at 和 updated_at)作为 ActiveSupport::TimeWithZone 实例返回。
根据文档,ActiveSupport::TimeWithZone 和 Time 具有相同的 API,所以我会使用 Time。
在不相关的注释中,您可以在字符串上调用 to_time 和 to_datetime 方法:
"2012-05-09".to_time # => 2012-05-09 00:00:00 UTC
"2012-05-09".to_datetime # => Wed, 09 May 2012 00:00:00 +0000
【讨论】: