Ruby日期数学:为什么要关闭一天

时间:2012-07-16 02:08:17

标签: ruby-on-rails ruby datetime

我想知道多少天前有一个Date对象。

(Date.today - start_time).to_i

当我(Date.today - 30.days.ago.to_date).to_i时,我得到29。想法?

1 个答案:

答案 0 :(得分: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天的偏差。

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

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