当用户注册我的一个网站进行免费试用时,我将他们的帐户到期时间设置为“14.days.from_now”。然后在主页上我显示他们还剩下多少天,我得到了:
(user.trial_expires - Time.now)/86400
(因为一天有86400秒,即60 * 60 * 24)
有趣的是,这个结果超过了 14,所以四舍五入到 15。在控制台中仔细调查后,这只会在未来两天发生(如果你知道我的意思)。例如
>> Time.now
=> Fri Oct 29 11:09:26 0100 2010
>> future_1_day = 1.day.from_now
=> Sat, 30 Oct 2010 11:09:27 BST 01:00
#ten past eleven tomorrow
>> (future_1_day - Time.now)/86400
=> 0.999782301526931
#less than 1, what you'd expect right?
>> future_2_day = 2.day.from_now
=> Sun, 31 Oct 2010 11:09:52 GMT 00:00
>> (future_2_day - Time.now)/86400
=> 2.04162248861183
#greater than 2 - why?
我想这可能与时区有关 - 我注意到从现在开始的 1 天的时间是 BST,而从现在开始的 2 天的时间是 GMT。所以,我尝试使用本地时间并得到相同的结果!
>> future_2_day = 2.day.from_now.localtime
=> Sun Oct 31 11:11:24 0000 2010
>> (future_2_day - Time.now)/86400
=> 2.04160829127315
>> (future_2_day - Time.now.localtime)/86400
=> 2.04058651585648
然后我想知道差异有多大,结果正好是一个小时。所以它看起来像一些时区怪异,或者至少与我不理解的时区有关。目前我的时区是 BST(英国夏令时),目前比 UTC 晚一小时(直到本周日它恢复到与 UTC 相同的时间)。
当我将两天时间添加到 Time.now 时,似乎引入了额外的时间:检查一下。我从 Time.now 开始,加上两天,减去 Time.now,然后从结果中减去两天的秒数,剩下一个小时。
我突然想到,在一个拍脑袋的时刻,这是因为时钟在星期天早上倒退:即星期天早上 11.20,从现在开始还有两天和一个小时。我正要删除所有这篇文章,但后来我注意到了这一点:我想'啊,我可以通过使用 (24*daynum).hours 而不是 daynum.days 来解决这个问题,但我仍然得到相同的结果:即使当我用秒!
>> (Time.now + (2*24).hours - Time.now) - 86400*2
=> 3599.99969500001
>> (Time.now + (2*24*3600).seconds - Time.now) - 86400*2
=> 3599.999855
所以现在我又困惑了。现在加上两天的秒数,减去现在,减去两天的秒数,怎么能等于一小时的秒数?额外的一小时潜伏在哪里?