Ruby日期计算:为什么会相差一天?

4
我正在尝试找出一个 Date 对象是多少天前的。
(Date.today - start_time).to_i

当我执行(Date.today - 30.days.ago.to_date).to_i时,结果是29。您有什么想法?

2
你能打印出Date.today和30.days.ago.to_date的原始输出吗? - lulalala
1个回答

8
听起来像是一个四舍五入的问题?to_i 对浮点数或有理数进行四舍五入并不好用,它会直接截断。所以,如果你的表达式返回了 29.999999,基本上相当于 30,但是你对其运行 to_i,你最终得到的是 29。
相反,你应该使用 round,它可以进行正确的数学四舍五入:
(Date.today - 30.days.ago.to_date).round
=> 30

编辑

实际上我错了。原因是Rails的ago方法返回UTC时区的时间,而不是本地时间。而Date.today似乎返回本地时间。

所以,如果你(不)幸运,当本地时间和UTC时间差距横跨午夜时,你将得到1天的偏移量。

正确的解决方法是在ago上调用localtime来将返回的时间转换为本地时区:

30.days.ago
=> Sat, 16 Jun 2012 03:17:44 UTC +00:00

30.days.ago.localtime
=> Sat Jun 16 06:21:47 +0300 2012

(Date.today - 30.days.ago.localtime.to_date).to_i
=> 30

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接