3 回答
TA贡献1802条经验 获得超6个赞
这可能很有用:
echo Date("Y-m-d", strtotime("2013-01-01 +1 Month -1 Day"));
// 2013-01-31
echo Date("Y-m-d", strtotime("2013-02-01 +1 Month -1 Day"));
// 2013-02-28
echo Date("Y-m-d", strtotime("2013-03-01 +1 Month -1 Day"));
// 2013-03-31
echo Date("Y-m-d", strtotime("2013-04-01 +1 Month -1 Day"));
// 2013-04-30
echo Date("Y-m-d", strtotime("2013-05-01 +1 Month -1 Day"));
// 2013-05-31
echo Date("Y-m-d", strtotime("2013-06-01 +1 Month -1 Day"));
// 2013-06-30
echo Date("Y-m-d", strtotime("2013-07-01 +1 Month -1 Day"));
// 2013-07-31
echo Date("Y-m-d", strtotime("2013-08-01 +1 Month -1 Day"));
// 2013-08-31
echo Date("Y-m-d", strtotime("2013-09-01 +1 Month -1 Day"));
// 2013-09-30
echo Date("Y-m-d", strtotime("2013-10-01 +1 Month -1 Day"));
// 2013-10-31
echo Date("Y-m-d", strtotime("2013-11-01 +1 Month -1 Day"));
// 2013-11-30
echo Date("Y-m-d", strtotime("2013-12-01 +1 Month -1 Day"));
// 2013-12-31
TA贡献1789条经验 获得超10个赞
这是另一个完全使用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
TA贡献1719条经验 获得超6个赞
为什么它不是一个bug:
目前的行为是正确的。内部发生以下情况:
+1 month将月份数(原来为1)增加1。这就是约会2010-02-31。
第二个月(二月)在2010年只有28天,所以PHP自动更正了这一点,只是继续计算从2月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";
?>
此脚本将正确输出February。当PHP处理此first day of next month节时,会发生以下情况:
next month将月份数(原来为1)增加1。这使得日期为2010-02-31。
first day of将日期编号设置为1,导致日期为2010-02-01。
- 3 回答
- 0 关注
- 484 浏览
添加回答
举报