为什么在某个日期加上和减去2个月没有给出相同的日期?

时间:2017-08-31 20:49:34

标签: ruby-on-rails ruby date

我对这个结果感到有点困惑,把今天的日期减去2个月,然后再拿这个日期再增加两个月,并没有给我今天将日期分配给变量的日期。

  

Time.zone   “东部时间(美国和加拿大)”

> today = Date.today.in_time_zone
=> Thu, 31 Aug 2017 00:00:00 EDT -04:00

> a = today - 2.months # This is persisted to the db
=> Fri, 30 Jun 2017 00:00:00 EDT -04:00

> b = a + 2.months
=> Wed, 30 Aug 2017 00:00:00 EDT -04:00

但是,如果我使用同一个物体,它会来回移动:

> today = Date.today.in_time_zone
=> Thu, 31 Aug 2017 00:00:00 EDT -04:00

> today - 2.months
=> Fri, 30 Jun 2017 00:00:00 EDT -04:00

> today + 2.months
=> Tue, 31 Oct 2017 00:00:00 EDT -04:00

问题显然是“a”被保存到数据库,然后稍后检索,计算加2个月......,它应该与今天的日期匹配。

1 个答案:

答案 0 :(得分:2)

TL; DR

一个月不是固定的持续时间。添加或服用一个月不会给出相同的“时移”,具体取决于您所在的日期。

通常的算法

添加或需要几个月的时间如下:

  • 尝试在同一天登陆(第4,第30,第31位),只需更改月份
  • 如果您将在一个不可能的日期(如9月31日,2月30日,2月29日一些年)登陆,那么只是去本月的最大允许日期

这意味着添加几个月然后取出相同的月数并不一定会让你回到同一个日期。

示例:

某个月的第31个月+ 1个月 - >人们希望能够到达下个月的31日

但如果下个月没有第31天(比如8月31日,9月31日),那该怎么办?

通常的解释会说你想要到月底,这是9月30日(例如租金或其他月租)

但通常,某个月的30日 - 1个月 - >人们希望到达上个月的第30天。

这将导致...... 8月30日。不是8月31日。

因此:某个日期+ 1个月 - 1个月并不一定会给出原始日期!

另一个例子

从8月30日开始。

花一个月 - > 7月30日

添加一个月 - >你想要到8月30日(相同数字,下个月)或8月底?

默认算法会尝试提供相同的日期编号 - > 8月30日(现在更符合逻辑)

还有几天......

请注意,同样的问题会在几天内发生,但更不常见!当某些天没有相同的小时数时,对于夏令时,当添加和使用相同的天数时,您可能无法在开始时回到原来的日期和时间。 / p>