2011-04-08 42 views
26

这两个我应该用我的Rails应用程序:DateTime.now或Time.now?

DateTime.now or Time.now 

有没有在这两个应用程序中使用任何危害?

在以上(now)示例的情况下,两者之间是否会有任何差异? (在我目前的系统,他们都显示相同的时间)

+1

的ActiveRecord和其他奥姆斯像DateTime和日期为他们的数据库记录。我认为这是因为Date比Time有更大的范围。时间是基于操作系统的时间概念,并且如果我记得,它与时区信息的整合更好。你可能想看看['home_run'](https://github.com/jeremyevans/home_run)作为一个替代品,它应该快得多。 – 2011-04-08 23:22:44

回答

11

在参考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" 
+0

是的,如果你不指望它们,分数秒可能看起来很糟糕,但如果你想通过转换为秒的整数值,或者通过使用'strftime'来格式化它们,同时保持它们为任何时间戳数学。 – 2011-04-08 23:20:42

+1

我正在使用Rails 3,DateTime也有小数秒。这种差异只存在于Rails 2中吗? – 2011-08-15 14:39:57

6

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

Time.nowDateTime.now都会在系统时间返回一个时间,通常设置为UTC。

+2

按照Yarin的建议,使用(Date)[Time.current](https://github.com/rails/rails/blob/ffc273577a795bb41068bfc2a1bb575ec51a9712/activesupport/lib/active_support/core_ext/time/calculations.rb#L29)。如果Time.zone设置,Time.current将返回Time.zone.now,否则返回Time.now。 – jayeff 2014-07-29 09:48:53

29

使用(Date)Time.current代替(Date)Time.now

滑轨延伸TimeDateTime对象,并且包括current属性检索Rails环境被设置为(默认= UTC)的时间,而不是在服务器时间(可能是任何事情)。

这很关键 - 除非在用户输入或显示的时区之间进行转换,否则应该始终以UTC时间工作,但许多生产系统默认为而非 UTC。 (例如Heroku的设置为PST(GMT -8))

见第here

+0

Time.now.utc也解决了它,不是吗? – user2503775 2013-09-15 10:51:49

+1

@ user2503775 - 是的,你可以使用它,但如果出于某种原因*你确实想在非UTC时区工作(我认为这从来不是一个好主意),至少你可以通过改变切换环境变量而不必更改代码中的一堆值。 – Yarin 2013-09-15 12:03:40

+0

@Yarin使用Time.zone.now代替Time.current而不是Time.now – ajahongir 2013-09-17 18:11:37