PHP日期时间:如何修改增加和减少月份?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (48)

我一直在努力工作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-31 2001-03-03

任何人都可以证明为什么这不被视为一个错误?

此外,是否有人有任何优雅的解决方案来纠正问题,并使其成为如此+1个月将按预期工作,而不是按预期工作?

提问于
用户回答回答于

为什么它不是一个错误:

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

  1. +1 month月份数(原为1)增加1。这使得日期2010-02-31
  2. 第二个月(二月)仅在2010年有28天,所以PHP会自动纠正这个问题,只是继续计算从2月1日起的日期。然后你在3月3日结束。

如何得到你想要的:

要得到你想要的是:手动检查下个月。然后添加下个月的天数。

我希望你能自己编码。我只是在做什么。

PHP 5.3方式:

为了获得正确的行为,你可以使用介绍相对时间节的PHP 5.3新功能之一first day of。此节可以组合使用next monthfifth 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节时,会发生以下情况:

  1. next month月份数(原为1)增加1。这使得日期2010-02-31。
  2. first day of将日期编号设置为1,导致日期为2010-02-01。
用户回答回答于

这可能有用:

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

扫码关注云+社区