为了账号安全,请及时绑定邮箱和手机立即绑定

PHP DateTime ::修改添加和减去月份

PHP DateTime ::修改添加和减去月份

PHP
catspeake 2019-09-02 14:58:28
我一直在努力工作,DateTime class并且最近遇到了我认为添加月份时的错误。经过一些研究后,似乎它不是一个bug,而是按预期工作。根据此处的文档:示例#2在添加或减去月份时要小心<?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";?>The above example will output:2001-01-312001-03-03任何人都可以证明为什么这不被视为错误?此外,是否有人有任何优雅的解决方案来纠正问题并使其成为+1个月将按预期工作而不是按预期工作?
查看完整描述

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


查看完整回答
反对 回复 2019-09-02
?
至尊宝的传说

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


查看完整回答
反对 回复 2019-09-02
?
慕侠2389804

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。


查看完整回答
反对 回复 2019-09-02
  • 3 回答
  • 0 关注
  • 484 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信