DateTime.now 还是 Time.now?
Posted
技术标签:
【中文标题】DateTime.now 还是 Time.now?【英文标题】:DateTime.now or Time.now? 【发布时间】:2011-08-01 19:43:30 【问题描述】:我应该在我的 Rails 应用程序中使用这两者中的哪一个:
DateTime.now or Time.now
在应用程序中同时使用两者有什么害处吗?
在上述 (now
) 示例的情况下,两者之间是否有任何区别? (在我当前的系统上,它们都显示相同的时间)
【问题讨论】:
ActiveRecord 和其他 ORM,如 DateTime 和 Date 用于他们的数据库记录。我认为这是因为日期的范围比时间更大。时间基于操作系统的时间概念,如果我记得的话,它与时区信息有更好的集成。您可能希望将home_run
视为一种应该更快的替代方案。
【参考方案1】:
使用 (Date)Time.current
代替 (Date)Time.now
Rails 扩展了Time
和DateTime
对象,并包含current
属性,用于检索Rails 环境设置的时间(默认值= UTC),而不是服务器时间(可以是任何时间)。
这很关键 - 您应该始终使用 UTC 时间,除非在时区之间转换以供用户输入或显示 - 但许多生产系统默认情况下 不是 UTC。 (例如 Heroku 设置为 PST (GMT -8))
见文章here
【讨论】:
@user2503775 - 是的,您可以使用它,但如果出于某种原因您确实想在非 UTC 时区工作(我认为这绝不是一个好主意) ,至少您可以通过切换环境变量来进行更改,而不必更改代码中的一堆值。 @Yarin 使用 Time.zone.now 而不是 Time.current 而不是 Time.now @ajahongir Time.current 如果设置了区域,则返回 Time.zone.now,如果没有,则返回 Time.nowcurrent
确实有助于避免编写 Time.now.zone
,但它确实不解决了添加潜在小数秒的问题,正如@slandau 的回答所指出的那样。跨度>
我的理解是,活动记录总是将日期时间转换为 UTC,然后再将其存储到日期时间字段中。因此,仅在当前时区工作并让 Rails 魔术在幕后进行这些转换不是最好的策略吗?【参考方案2】:
如果你想获取应用程序所在时区的时间,你需要调用Time.zone.now
,这就是我通常使用的。
Time.now
和 DateTime.now
都将返回系统时间中的时间,通常设置为 UTC。
【讨论】:
也可以按照 Yarin 的建议使用 (Date)Time.current。如果设置了 Time.zone,Time.current 将返回 Time.zone.now,否则返回 Time.now。【参考方案3】:参考Time.now
(不是DateTime.now
):
创建的对象将使用系统时钟上可用的分辨率创建,因此可能包括小数秒。
a = Time.new #=> Wed Apr 09 08:56:03 CDT 2003
b = Time.new #=> Wed Apr 09 08:56:03 CDT 2003
a == b #=> false
"%.6f" % a.to_f #=> "1049896563.230740"
"%.6f" % b.to_f #=> "1049896563.231466"
【讨论】:
是的,如果您不期望小数秒可能看起来很糟糕,但如果您愿意,可以通过将秒数转换为整数值或使用strftime
格式化它们来截断它们同时为任何时间戳数学维护它们。
我正在使用 Rails 3,并且 DateTime 也有小数秒。这种差异只存在于 Rails 2 中吗?以上是关于DateTime.now 还是 Time.now?的主要内容,如果未能解决你的问题,请参考以下文章