簡體   English   中英

DateTime 修改 function 跳過二月

[英]DateTime modify function skips February

使用DateTime::modify方法添加一個月時,結果會跳過二月。

  • 為什么不輸出2020-02-31
  • 如何使用日期時間 output 2020-02-29 (當月的最后一天)。
$date = new DateTime("2020-01-31");
echo $date->modify("+1 month")->format("Y-m-d"); // 2020-03-02

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和 output 2020-03-31巧妙地添加一個月。

為什么會發生?

公歷中一個月的平均長度是 30.436875 天:

  • 4月、6月、9月和11月30天;
  • 一月、三月、五月、七月、八月、十月和十二月共31天;
  • 2 月 28 天或 29 天(閏年)。

PHP 會將給定月份的確切天數添加到當前日期。

因此,如果您從該月的最后一天開始遞增,PHP 將在第一次遞增之后調整日期。

例如:

讓我們從 3 月的最后一天(31 日)開始添加一個月。

由於當前月份(三月)有 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 月 由於二月總是有 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).

這就是為什么建議從每月的第一天開始增加月份的原因,因為第一天對所有月份都是通用的。

$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

我假設您正在 php 中編程。 如果是這樣,文檔表明您將收到php DateTime::modify()的結果。

該文檔特別指出“當心”

Example #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月的月底,我們在R中經常做的就是go到當月的月底,然后再加上+1天,然后Z34D1F91FB2E514B8576FAB1A7B的月底再加Z34D1F91FB2E514B8576FAB1A7B。 如果您知道您總是在月末,那么只需添加 +1 天,然后 go 到月末。

其他帖子在這個空間有一些額外的建議如何找到從日期開始的月份的最后一天?

這篇文章的例子:

 $date = new DateTime('now');
 $date->modify('last day of this month');
 echo $date->format('Y-m-d');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM