4

Date我试图找出一个对象是多少天前。

(Date.today - start_time).to_i

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

4

1 回答 1

8

听起来像是一个四舍五入的问题?to_i不适合进行舍入,因为它会截断浮点数或有理数。

因此,如果您的表达式返回 29.999999,基本上是 30,但您to_i在上面运行,您最终会得到 29。

你应该做的是 use round,它会进行适当的数学舍入:

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

编辑

其实我错了。原因是 Railsago方法返回 UTC 时区的时间,而不是本地时间。而Date.today似乎在当地时间返回。

因此,如果您(不)幸运的话,如果当地时间和 UTC 时差恰好穿过午夜,您将获得 1 天的偏移量。

正确的解决方法是调用将返回的时间转换为本地时区localtimeago

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
于 2012-07-16T02:41:05.357 回答