在Ruby,万圣节:
Date.today - 6.months + 6.months != Date.today
我们需要更新Ruby的日期实现吗?其他语言有同样的问题吗?
答案 0 :(得分:38)
如果您在没有31天的任何月份(即3个月工作正常,但1个月,或6个或8个都会使这种情况发生),就会发生这种情况。
如果你Date.today - 1.month
,看起来Rails看到9/31/2011不是一个有效的日期,所以它会再多花一天让它成为一个有效的日期。但是,当你从9月底前往一个月后,它会在2011年10月30日离开,因为这是一个有效的日期。基本上,Rails只是尝试增加(或减少)月份字段,只要它是有效日期,它就不会调整日期字段。
解决此问题的一种方法是在Rails中的.end_of_month
对象上使用.beginning_of_month
(或Date
)方法,以确保始终获得结束或开始一个月。
答案 1 :(得分:11)
不,这是预期的,这也不是Ruby独有的 - 例如在SQL中尝试。
(Today - 6 months)
是4月的最后一天(30日) - 因为没有第31天。这只是我们处理的几个月,而不是确切的天数。
将截至4月30日的6个月添加到10月30日。
你知道的是!= 10月31日。
答案 2 :(得分:6)
这是ActiveSupport时间扩展的一个奇怪功能。
> 6.months == 180.days
=> true
但是当您使用月份进行数学计算时,它们被视为日历月,而不是30天。看看这个:
> Date.today - 180.days + 180.days
=> Mon, 31 Oct 2011