【问题标题】:Which should I always parse date times with? DateTime, Time, Time.zone?我应该总是用哪个来解析日期时间?日期时间、时间、时区?
【发布时间】:2012-05-18 13:52:09
【问题描述】:

在 Rails 中,我发现我有几个选项可以解析日期和日期时间。仅出于通过 ActiveRecord 将日期持久保存到数据库中的目的而​​解析日期的最佳做法是什么?为什么?

Time.zone.parse(...)
Time.parse(...)
DateTime.parse(...)

【问题讨论】:

  • 还有thisthis,表示在处理日期或遥远未来的日期时使用DateTime。

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

如果您只想写入 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 “默认”为 UTC 如果您的 Rails 应用程序默认为 UTC(在 environment.rb 中)... Time.parse 默认为服务器本地时区偏移量,不管 Rails应用程序。
  • 嘿,Time.zone.parse 正确采用了 rails 默认区域,而 DateTime 返回 UTC。所以+1,但是“应该避免日期时间”还有其他原因吗?
【解决方案2】:

由 ActiveRecord 自动设置的时间(例如 created_atupdated_at)作为 ActiveSupport::TimeWithZone 实例返回。

根据文档,ActiveSupport::TimeWithZoneTime 具有相同的 API,所以我会使用 Time

在不相关的注释中,您可以在字符串上调用 to_timeto_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

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2020-01-05
    • 2020-10-19
    • 2011-09-28
    相关资源
    最近更新 更多