Mit der PHP-Methode DateTime::modify können Monate addiert und subtrahiert werden.
P粉046387133
2023-08-06 18:43:52
<p>Ich habe die DateTime-Klasse häufig verwendet und bin kürzlich beim Hinzufügen von Monaten auf einen meiner Meinung nach fehlerhaften Fehler gestoßen. Nach einigen Recherchen wurde festgestellt, dass es sich hierbei nicht um einen Fehler handelt, sondern wie erwartet funktioniert. Laut der hier gefundenen Dokumentation: </p>
<blockquote>
<p>Beispiel #2 Seien Sie vorsichtig beim Hinzufügen von oder
Monate subtrahieren</p>
</blockquote>
<pre class="brush:php;toolbar:false;"><?php
$date = new DateTime('2000-12-31');
$date->modify('+1 Monat');
echo $date->format('Y-m-d') .
$date->modify('+1 Monat');
echo $date->format('Y-m-d') .
?></pre>
<blockquote>
<pre class="brush:php;toolbar:false;">Das obige Beispiel gibt Folgendes aus:
31.01.2001
2001-03-03</pre>
</blockquote>
<p>Kann jemand erklären, warum dies nicht als Fehler angesehen wird? <br /><br />Hat jemand außerdem eine elegante Lösung, um dies zu korrigieren, sodass +1 Monat wie erwartet und nicht wie geplant funktioniert? </p><p><br /></p>
这是另一种完全使用DateTime方法的简洁解决方案,可以直接修改对象而不创建克隆。
它的输出是:
为什么这不是一个错误:
当前的行为是正确的。以下是内部发生的情况:
+1个月会将月份(原始为1)增加1。这使得日期变成了2010-02-31。
2010年的二月只有28天,所以PHP会自动修正这个问题,继续从二月1日开始计算天数。因此,最终得到的日期是3月3日。
如何得到你想要的结果:
要得到你想要的结果,可以手动检查下个月,然后添加下个月的天数。
希望你能自己编写这段代码。我只是提供了具体的操作步骤。
PHP 5.3的方法:
为了获得正确的行为,你可以使用PHP 5.3引入的相对时间语句“first day of”。这个语句可以与“next month”、“fifth month”或“+8 months”结合使用,以前往指定月份的第一天。与你目前使用的“+1 month”相比,你可以使用以下代码来获得下个月的第一天:
这个脚本将正确输出二月。当PHP处理这个下个月第一天的语句时,会发生以下情况:
next month将月份(原始为1)增加1。这使得日期变成了2010-02-31。
first day of将日期的天数设置为1,结果是日期变成了2010-02-01。