Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
PHP DateTime sub生成意外的结果_Php_Date_Datetime_Dateinterval - Fatal编程技术网

PHP DateTime sub生成意外的结果

PHP DateTime sub生成意外的结果,php,date,datetime,dateinterval,Php,Date,Datetime,Dateinterval,我有一个从DateTimeImmutable中减去DateInterval的例子 $dateA = new DateTimeImmutable('2016-06-30'); $dateB = new DateTimeImmutable('2016-05-31'); $dateInterval = new DateInterval('P3M'); // print 2016-03-30 as expected echo $dateA->sub($dat

我有一个从DateTimeImmutable中减去DateInterval的例子

    $dateA = new DateTimeImmutable('2016-06-30');
    $dateB = new DateTimeImmutable('2016-05-31');
    $dateInterval = new DateInterval('P3M');
    // print 2016-03-30 as expected
    echo $dateA->sub($dateInterval)->format('Y-m-d'); 
    // print 2016-03-02 which i would expect 2016-02-29
    echo $dateB->sub($dateInterval)->format('Y-m-d');
当我将周期设置为“P8M”时,它会按预期工作。它是怎么来的,在二月份有效吗

好吧,这真的很简单(有点)。每个“月”间隔计算为前一个月(或前一个月的X个数)的等效日期。如果当前月份的天数多于登陆月份的天数,则多余的天数会溢出到下一个月

因此,如果您的日期是2016年5月31日,并且希望减去3个月的间隔,那么它将:

  • 追溯到3个月(在月份列表中,暂时不要想日子),结果是“二月”
  • 然后看看2月31日。这是不存在的,因此将出血时间延长至下个月2天(2016年2月有29天,因此额外增加2天)
  • 中提琴!三月二日
向前看,假设你在2016年5月31日,想再增加一个月

  • 提前一个月到六月
  • 看看6月31日,不,多了一天,流血到7月
  • 正如所料,7月1日是答案
这其中的教训是:增加和减少月份间隔很糟糕,令人困惑,并且可能导致非直观的结果,除非你已经有了月份计算rosetta stone。

来自

注意: 相对月份值是根据它们经过的月份长度计算的。例如,“2011-11-30年+2个月”,将产生“2012-01-30”。这是因为11月有30天,12月有31天,总共有61天


因为2月30日是2016-03-02。但是如果你将日期设置为1-28号,它会像你预期的那样工作。为什么这总是“出乎意料”?@MarkBaker可能,当将日期设置为一个月的最后一天时,有人想以这种方式进入另一个月的最后一天month@splash58今年(2016年)是闰年,二月有29天。2月30日将是2016-03-01事实上,我认为这是计算机完美的逻辑行为。。。。计算机不是直观的,它们没有智能,它们只是遵循一组预定义的规则。。。。由于缺乏人类智慧,日期等主题需要大量的文档(例如,美国和英国/欧洲格式之间的日期格式差异,需要解释);这并不是因为它是深奥的计算机逻辑,而是为了确保世界不同地区的人们理解不同之处。谢谢,我不知道有一个相对的格式页面。我仍然觉得这个月的解释有点混乱,你能看看我的答案,看看它是否更直观(或不正确)?