为什么 Date.today - 6.months + 6.months 不等于 Date.today?

31

在 Ruby 中,万圣节:

Date.today - 6.months + 6.months != Date.today

我们需要更新Ruby的日期实现吗?其他语言是否也有同样的问题?


5
这并不是编程语言的问题,而是日历问题。只要月份的天数不完全相同(由于一年的长度这是不可避免的),就无法使“月份算术”像其他算术一样正常工作。唯一解决这个问题的方法是调整地球绕太阳运转的速度或地球绕轴旋转的速度。 - John Y
5
有没有用于修复地球自转速度的 Ruby gem? - Cesar
3个回答

38
如果您对没有31天的任何月份进行操作(例如,3个月就可以正常工作,但1个月、6个月或8个月都会发生这种情况),就会出现这种情况。
如果执行 Date.today - 1.month,似乎Rails会发现2011年9月31日不是一个有效的日期,因此它会将其向后推迟一天使其成为一个有效的日期。然而,当您从9月底向前推进一个月时,它将保持在2011年10月30日,因为那是一个有效的日期。基本上,Rails只是试图增加(或减少)月份字段,只要它是一个有效的日期,它就不会调整日期字段。
解决此问题的一种方法是在Rails中使用Date对象的.end_of_month (或 .beginning_of_month)方法,以确保始终获得月份的末尾或开头。

11

不,这是可以预料的,而且这并不仅限于Ruby-例如在SQL中尝试。

(今天 - 6个月) 是4月份的最后一天(30日)-因为没有31日。我们只考虑月份,而不是精确的天数。

将4月30日加上6个月,你会得到10月30日。

你知道,这与10月31日不同。


有趣。看起来它可能会引起问题(实际上对我来说确实如此)。 - B Seven

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接