Rails错误的日期算术结果

时间:2017-05-01 20:00:56

标签: ruby-on-rails datetime ruby-on-rails-4

我得到了一个奇怪的结果:

char

最终结果应该是2017-05-01吗?

3 个答案:

答案 0 :(得分:3)

不是真的。 ActiveSupport::Duration在幕后做了一些工作,以便更直观地处理日期。举个例子:

Time.now + 1.month

无论月Time.now是什么,无论月中的天数如何,结果总是提前1个月。 2月1日到3月1日。3月1日到4月1日。

但是,当你使用这样的电话时,你会这样做:

time = Time.now
time - 1.month #=> April 1
time - 3.days #=> March 29
time + 1.month #=> April 29
time + 3.days #=> May 2 (three days after Apr 29)

如果您想要更改此行为,可以将这些ActiveSupport :: Duration实例转换为绝对秒数,然后它可以以任何方式工作:

temporal_offset = 1.month + 3.days
time = Time.now
time - temporal_offset.to_i + temporal_offset.to_i
#=> (same time as Time.now)

答案 1 :(得分:1)

这是因为git push heroku master 正好提前或回溯一个月,可能是28天,29天,30天或31天。这种奇怪但极其正确的行为,是因为3月有31天但是4月30日。

所以用

-/+ 1.month

答案 2 :(得分:1)

我相信它是按顺序计算的:

2.3.3 :001 > Time.now
 => 2017-05-01 16:05:12 -0400
2.3.3 :002 > Time.now - 1.month
 => 2017-04-01 16:05:14 -0400
2.3.3 :003 > Time.now - 1.month - 3.days
 => 2017-03-29 16:05:17 -0400
2.3.3 :004 > Time.now - 1.month - 3.days + 1.month
 => 2017-04-29 16:05:19 -0400
2.3.3 :005 > Time.now - 1.month - 3.days + 1.month + 3.days
 => 2017-05-02 16:05:22 -0400
相关问题