B S*_*ven 31 ruby ruby-on-rails date ruby-on-rails-3
在Ruby中,在万圣节:
Date.today - 6.months + 6.months != Date.today
Run Code Online (Sandbox Code Playgroud)
我们需要更新Ruby的日期实现吗?其他语言有同样的问题吗?
Dyl*_*kow 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
以确保您始终获得一个月的结束或开始.
Wid*_*dor 11
不,这是预期的,这也不是Ruby独有的 - 例如,在SQL中尝试.
(Today - 6 months)
是4月的最后一天(30日) - 因为没有第31天.这只是我们处理的月份,而不是确切的天数.
添加6个月到4月30日,你将在10月30日.
你知道的是!= 10月31日.
这是ActiveSupport时间扩展的一个奇怪功能.
> 6.months == 180.days
=> true
Run Code Online (Sandbox Code Playgroud)
但是当你用数月计算数学时,它们被认为是日历月,而不是30天.看一下这个:
> Date.today - 180.days + 180.days
=> Mon, 31 Oct 2011
Run Code Online (Sandbox Code Playgroud)
请参阅https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/time/calculations.rb#L277并从那里进一步挖掘.