【发布时间】:2012-09-25 00:57:59
【问题描述】:
让我们看看日期:
1.9.2p320 :008 > Date.today
=> Wed, 03 Oct 2012
1.9.2p320 :009 > Time.now
=> 2012-10-03 22:32:55 -0400
现在,既然是午夜了?
1.9.2p320 :005 > Date.today.midnight
=> Wed, 03 Oct 2012 00:00:00 UTC +00:00
有道理。但是昨天呢?
1.9.2p320 :006 > Date.yesterday.midnight
=> Wed, 03 Oct 2012 00:00:00 UTC +00:00
呃,这不太合理。今天的午夜和昨天的午夜一样吗?你不能是认真的!
1.9.2p320 :026 > Date.today.midnight == Date.yesterday.midnight
=> true
1.9.2p320 :033 > 1.day.ago.midnight == Date.yesterday.midnight
=> true
1.9.2p320 :034 > 1.day.ago.midnight == Date.today.midnight
=> true
哦,你是认真的。明天呢?
1.9.2p320 :007 > Date.tomorrow.midnight
=> Fri, 05 Oct 2012 00:00:00 UTC +00:00
等一下,如果今天午夜是 3 日 00:00,昨天午夜是 3 日 00:00,但明天午夜是 5 日 00:00,那么哪里是 4 日 00:00?
这里是:
1.9.2p320 :010 > 0.days.ago
=> Thu, 04 Oct 2012 02:34:58 UTC +00:00
1.9.2p320 :011 > 0.days.ago.midnight
=> Thu, 04 Oct 2012 00:00:00 UTC +00:00
但不是零天前今天?显然不是。
是我,还是这根本不是内部一致的?在我看来 Date.today 应该与 0.days.ago 相同。
我知道days.ago 实际上是在使用 Time 对象,这是一个时区问题:
1.9.2p320 :030 > Date.today
=> Wed, 03 Oct 2012
1.9.2p320 :021 > Time.now
=> 2012-10-03 22:40:09 -0400
1.9.2p320 :023 > 0.days.ago
=> Thu, 04 Oct 2012 02:40:22 UTC +00:00
1.9.2p320 :022 > Time.zone.now
=> Thu, 04 Oct 2012 02:40:14 UTC +00:00
但似乎,鉴于这些是便利函数,将时区假设放入 one 便利函数而不是将其放入 另一个 便利函数是一种意思功能,从各方面来说,两者的含义相同。
即使撇开这一点不谈,它似乎也无法解释 Date.today.midnight == Date.yesterday.midnight 是——很简单——狂吠的事实。
既然我知道我不可能是第一个被这个咬伤的人,我问我错过了什么?
【问题讨论】:
标签: ruby-on-rails date time timezone utc