为什么Date.today - 6.months + 6.months!= Date.today?

时间:2011-10-31 17:13:26

标签: ruby-on-rails ruby ruby-on-rails-3 date

在Ruby,万圣节:

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

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

3 个答案:

答案 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 

请参阅https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/time/calculations.rb#L277并进一步深入挖掘。