'PHP - Weird behavior when I add a month to the date
When I try to add a month to a date and it's the last day of the month, i get this weird behavior
$data = date("Y-m-d", $date); // $date is 1643583600and $data-> 2022-01-31
$duedate = new DateTime($data); // $duedate -> "2022-01-31 00:00:00.000000"
$duedate->modify('+1 month'); // $duedate -> "2022-03-03 00:00:00.000000"
$m = $duedate->format('m'); // $m = 03
However, the problem does not exist if:
- I want to add a month to 2022-02-28
- the starting date is not a month end
Solution 1:[1]
instead of the last date of the month using the first date of the month.
date("2022-01-01") or date("Y-m-01")
$data = date("2022-01-01"); // $date is 1643583600and $data-> 2022-01-01
$duedate = new DateTime($data); // $duedate -> "2022-01-01 00:00:00.000000"
$duedate->modify('+1 month'); // $duedate -> "2022-02-02 00:00:00.000000"
$m = $duedate->format('m');
echo $data." ".$m;
Output
2022-01-01 02
Solution 2:[2]
If you're only interested in the number of the next month, you can ask for the first day of next month and you'll be fine.
Note: You can directly insert a timestamp into DateTime if you prepend it with @
$date=1643583600;
$duedate = new DateTime("@$date");
$duedate->modify("first day of next month");
echo $duedate->format('n');
output: 2
Solution 3:[3]
This behavior is because of the overflow of no. of days in a month it tries to add. If you wish to get only last day of each month, you can use the t symbol in date like below, which gives you no. of days in a month which is automatically the last day:
<?php
for($i = 1; $i <= 12; ++$i){
echo date("Y-m-t", strtotime(date("Y") . "-". $i. "-01")),PHP_EOL;
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Bhargav Chudasama |
| Solution 2 | Michel |
| Solution 3 | nice_dev |
