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