DateTime修改功能跳过2月

问题描述 投票:1回答:2

[使用DateTime::modify方法添加一个月时,结果跳过2月。

  • 为什么不输出2020-02-31
  • 如何使用DateTime输出2020-02-29? (每月的最后一天)。
$date = new DateTime("2020-01-31");
echo $date->modify("+1 month")->format("Y-m-d"); // 2020-03-02
php date
2个回答
2
投票

PHP DateTime::modify("+n month")在当日增加28至31天,具体取决于月份和年份。

解决方案

我建议您使用modifyformat方法从一个月的第一天开始增加月份:

// Instanciates the DateTime object.
$date = new DateTime("2020-01-01");

// Adds a month to the date.
$date->modify("+1 month"); // 2020-02-01

// Format the date with "t" (gets the last day of the month).
$date->format("Y-m-t"); // 2020-02-29

从月份的第一天开始增加将[[从不引起二月的问题”,这是一个相当普遍的情况,认为PHP DateTime将从2020-02-29中聪明地增加一个月并输出2020-03-31

为什么会发生?

[在Gregorian calendar中,average length of a month是30.436875天:

    [4月,6月,9月和11月的30天;
  • [一月,三月,五月,七月,八月,十月和十二月的31天;
  • 2月的28天或29天(在leap years中)。
  • PHP将把给定月份中确切的天数添加到当前日期。

    因此,如果您从一个月的最后一天。

    例如:

    让我们从三月的最后一天(31日)开始增加一个月。

    由于当前月(3月)中有31天,因此PHP将自日期起增加31天。从2020-03-31开始增加31天将导致跳过整个4月。

    $date = new DateTime("2020-03-31"); // 2020-03-31 echo $date->modify("+1 month")->format("Y-m-d"); // 2020-05-01 | Added 31 days (since March has 31 days). echo $date->modify("+1 month")->format("Y-m-d"); // 2020-06-01 | Added 31 days (since the new date is May 1st, which is a month with 31 days). echo $date->modify("+1 month")->format("Y-m-d"); // 2020-07-01 | Added 30 days

    现在,让我们在4月的最后一天(30日)添加一个月。

    我们可以看到,由于接下来的几个月都有30天以上的时间,因此最后一天将保持不变,

    直到第二年2月]。由于2月总是有28天到29天之间的时间,因此加上31天将超过该月份,而产生的日期将是3月2日。

    $date = new DateTime("2020-04-30"); echo $date->modify("+1 month")->format("Y-m-d"); // 2020-05-30 | Added 30 days. echo $date->modify("+1 month")->format("Y-m-d"); // 2020-06-30 | Added 31 days. echo $date->modify("+1 month")->format("Y-m-d"); // 2020-07-30 | Added 30 days. // ... echo $date->modify("+1 month")->format("Y-m-d"); // 2021-01-30 | Added 31 days echo $date->modify("+1 month")->format("Y-m-d"); // 2021-03-02 | Added 31 days (since January has 31 days). echo $date->modify("+1 month")->format("Y-m-d"); // 2021-04-02 | Added 31 days (since the new date is March 2nd, which is a month with 31 days).
    这就是为什么建议从该月的第一天开始增加月份,因为

    1st

    对所有月份都是通用的。
  • $date = new DateTime("2020-01-01"); // 2020-01-01 echo $date->modify("+1 month")->format("Y-m-d"); // 2020-02-01 | Added 31 days echo $date->modify("+1 month")->format("Y-m-d"); // 2020-03-01 | Added 29 days (since 2020 is leap year, yee haw). echo $date->modify("+1 month")->format("Y-m-d"); // 2020-04-01 | Added 31 days

    0
    投票
    我假设您正在使用php进行编程。如果是这样,则文档表明您将收到得到的结果php DateTime::modify()
    © www.soinside.com 2019 - 2024. All rights reserved.