我们来看看日期:
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
但似乎,鉴于这些是便利函数,将时区假设扔到一个便利函数中而不是将其扔到另一个便利函数中是一种意思,从所有角度来看,两者都意味着同一件事。
即使撇开这一点不谈,它似乎也无法解释这样一个事实Date.today.midnight == Date.yesterday.midnight
,即——很简单——狂吠。
既然我知道我不可能是第一个被这个咬伤的人,我问我错过了什么?