ruby-on-rails - ruby 日期数学 : Why off by a day

标签 ruby-on-rails ruby datetime

我试图找出 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/

相关文章:

ruby-on-rails - rails_admin 参数 [ :query] in select field is ignored

ruby-on-rails - rails I8n : Use default locale when the requested locale (from HTTP header) is not available?

ruby-on-rails - ( ruby ) ruby 套接字 : how to create a POST request?

ruby-on-rails - Rspec 期望(实例)接收方法未按预期工作

javascript - MomentJS 在给定的持续时间内获取下一个指定的日期

css - 在 Rails Assets 管道中包含多个 LESS 文件

ruby - 在 ruby​​ 1.8.6 (each_char) 中遍历字符串的每个字符

mysql - 使用 Net::SSH::Gateway 时是否需要手动关闭 Sequel gem 连接?

javascript - 如何按分钟循环两个 DateTime? JavaScript

PHP/MySQL - 查找可用的时间段