PHP DateTime::modify 方法可以用来添加和减去月份。
P粉046387133
P粉046387133 2023-08-06 18:43:52
0
2
595
<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>
P粉046387133
P粉046387133

全部回复(2)
P粉709307865

这是另一种完全使用DateTime方法的简洁解决方案,可以直接修改对象而不创建克隆。

$dt = new DateTime('2012-01-31');

echo $dt->format('Y-m-d'), PHP_EOL;

$day = $dt->format('j');
$dt->modify('first day of +1 month');
$dt->modify('+' . (min($day, $dt->format('t')) - 1) . ' days');

echo $dt->format('Y-m-d'), PHP_EOL;

它的输出是:

2012-01-31
2012-02-29
P粉030479054

为什么这不是一个错误:

当前的行为是正确的。以下是内部发生的情况:

+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
$d = new DateTime( '2010-01-31' );
$d->modify( 'first day of next month' );
echo $d->format( 'F' ), "\n";
?>

这个脚本将正确输出二月。当PHP处理这个下个月第一天的语句时,会发生以下情况:

next month将月份(原始为1)增加1。这使得日期变成了2010-02-31。

first day of将日期的天数设置为1,结果是日期变成了2010-02-01。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板