我试图找出 Date
对象是多少天前。
(Date.today - start_time).to_i
当我执行 (Date.today - 30.days.ago.to_date).to_i
时,我得到 29
。想法?
最佳答案
听起来像是一个四舍五入的问题? to_i
不适合进行舍入,因为它会截断 float 或有理数。
因此,如果您的表达式返回 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
关于ruby-on-rails - ruby 日期数学 : Why off by a day,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11497345/