我得到了一个奇怪的结果:
char
最终结果应该是2017-05-01吗?
答案 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