Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么对一个日期加上或减去2个月不能返回相同的日期?_Ruby On Rails_Ruby_Date - Fatal编程技术网

Ruby on rails 为什么对一个日期加上或减去2个月不能返回相同的日期?

Ruby on rails 为什么对一个日期加上或减去2个月不能返回相同的日期?,ruby-on-rails,ruby,date,Ruby On Rails,Ruby,Date,我对这个结果有点困惑,把今天的日期减去2个月,然后再把那个日期加上两个月,在给变量赋值时,并没有给我今天的日期 时区 “东部时间(美国和加拿大)” 但是,如果我使用相同的对象,它会正确地来回移动: > 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 >

我对这个结果有点困惑,把今天的日期减去2个月,然后再把那个日期加上两个月,在给变量赋值时,并没有给我今天的日期

时区 “东部时间(美国和加拿大)”

但是,如果我使用相同的对象,它会正确地来回移动:

> 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个月的计算时间,它应该与今天的日期匹配。

TL;博士 一个月不是固定的持续时间。根据你是哪一天,增加或减少一个月不会产生相同的“时间变化”

常用算法 要添加或使用月份,请执行以下操作:

  • 只需更改月份,就可以尝试在开始的同一天(第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日(现在更符合逻辑)


还有几天。。。
请注意,同样的问题在几天内也会发生,但发生的次数要少得多!当某些天的小时数不相同时,对于夏令时,当添加和使用相同的天数时,您可能无法回到开始时的原始日期和时间。

您是否尝试过
(今天-2.month)+2.month
(不需要括号,只是为了演示)?添加“month”的问题所有的月份都不是相同的持续时间,有一些解释是日期/时间框架必须做的。。。通常,当您添加或减去月份时,您希望在下一个月/上一个月的同一天着陆。但是,如果不可能,那么天数必须更改。>(今天-2.months)+2.months=>周三,2017年8月30日00:00:00 EDT-04:00,我希望现在对您来说很明显,这个问题与为变量赋值无关。只是你实际上没有在两组示例中尝试相同的操作。但在我看来,这个框架中似乎缺少了一些东西/奇怪的地方,鉴于2017年8月31日,2个月前应该是什么样的,这个框架是否足够聪明呢还是先减去天数直到你到达一个新的月份,然后再减去天数直到你到达第二个新的月份?同样的上涨?我只是觉得这里有点不对劲?这是一个固有的问题,一定有错误,不管你选择什么解决方案。一个月不是一个固定的持续时间,框架不能“知道”您实际上想要回到某个精确的开始日期。在编程中正确的日期时间系统计算是一个非常难处理的问题。我认为,正如我在回答中所说的,所有框架AFAIK试图做的事情是:当你在8月份增加1个月时,你必须在9月份的某个地方着陆。如果你在8月加上31天,你将在10月1日登陆,这很糟糕,因此它会把你带回到前一天,9月30日。通常的算法是:尝试在另一个月获得相同的天数。如果日数太大,只需取本月最大的日数即可。算法必须通用且可预测。另外,想想看,它不可能知道你在到达这个特定日期之前做了什么计算。我希望我举了足够的例子来说服你。但所有这些都是某些特定框架存在的原因,请毫不犹豫地搜索一个可以根据需要计算这些内容的框架。
> 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