PHP DateTime::modify 方法可以用来添加和减去月份。
P粉046387133
2023-08-06 18:43:52
<p>我一直在大量使用DateTime类,最近在添加月份时遇到了一个我认为是错误的问题。经过一些研究,发现这实际上不是一个错误,而是按照预期的方式工作。根据在这里找到的文档:</p>
<blockquote>
<p>Example #2 Beware when adding or
subtracting months</p>
</blockquote>
<pre class="brush:php;toolbar:false;"><?php
$date = new DateTime('2000-12-31');
$date->modify('+1 month');
echo $date->format('Y-m-d') . "n";
$date->modify('+1 month');
echo $date->format('Y-m-d') . "n";
?></pre>
<blockquote>
<pre class="brush:php;toolbar:false;">The above example will output:
2001-01-31
2001-03-03</pre>
</blockquote>
<p>有人能解释为什么这不被视为一个错误吗?<br /><br />此外,有人有什么优雅的解决方案来纠正这个问题,使得+1个月能按预期工作,而不是按设计意图工作吗?</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。