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 扩展了TimeDateTime 对象,并包含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.now current 确实有助于避免编写 Time.now.zone ,但它确实解决了添加潜在小数秒的问题,正如@slandau 的回答所指出的那样。跨度> 我的理解是,活动记录总是将日期时间转换为 UTC,然后再将其存储到日期时间字段中。因此,仅在当前时区工作并让 Rails 魔术在幕后进行这些转换不是最好的策略吗?【参考方案2】:

如果你想获取应用程序所在时区的时间,你需要调用Time.zone.now,这就是我通常使用的。

Time.nowDateTime.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?的主要内容,如果未能解决你的问题,请参考以下文章

pandas学习笔记D2

VB中怎么获得系统日期与时间

python获取当前时间和前一天时间

python中的时区感知与时区天真

python 封装log输出到文件

python查询redmine中符合特定日期的issue