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

Dmi*_*ten 3 ruby datetime ruby-on-rails

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

(Date.today - start_time).to_i
Run Code Online (Sandbox Code Playgroud)

我什么时候(Date.today - 30.days.ago.to_date).to_i得到29.思考?

Cas*_*per 8

听起来像一个四舍五入的问题?to_i因为它会缩小浮点数或有理数,所以不适合进行舍入.

因此,如果你的表达式返回29.999999,它基本上是30,但你运行to_i它,你最终得到29.

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

(Date.today - 30.days.ago.to_date).round
=> 30
Run Code Online (Sandbox Code Playgroud)

编辑

其实我错了.原因是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
Run Code Online (Sandbox Code Playgroud)