PHP strtotime BUG processing
Recently used strtotime combined with -1 month, 1 month, next month to get the previous month or next month The date of the month, but I just saw an article and realized that using strtotime to directly obtain the date is still a little buggy
BUG
For example, date:
$today = '2020-12-31'; echo date("Y-m-d",strtotime("$today -1 month"))
Output
2020-12-01
As can be seen from the above output, the output is still December 2020
Analysis:
Do -1 first month, then the current one is 07-31, and after subtracting one, it is 06-31.
Do date normalization again, because there is no 31st in June, so it is like 2:60 is equal to 3:00, June 31 It is equal to July 1
. Is the logic very "clear"? We can also manually verify the second step, such as:
var_dump(date("Y-m-d", strtotime("2020-12-31"))); // 输出2020-12-01
In other words, as long as it involves the size of the month On the last day, there may be this confusion. We can also easily verify similar other months to confirm this conclusion:
var_dump(date("Y-m-d", strtotime("-1 month", strtotime("2020-12-31")))); // 输出2020-12-03 var_dump(date("Y-m-d", strtotime("+1 month", strtotime("2020-08-31")))); // 输出2020-10-01 var_dump(date("Y-m-d", strtotime("next month", strtotime("2020-01-31")))); // 输出2020-03-03 var_dump(date("Y-m-d", strtotime("last month", strtotime("2020-03-31")))); // 输出2020-03-03
Solution
From PHP5. Starting from 3, date has added a series of corrective phrases to clarify this problem, namely "first day of" and "last day of", which means you can limit the date so that the date is not automatically "normalized":
var_dump(date("Y-m-d", strtotime("last day of -1 month", strtotime("2020-03-31")))); //输出2020-02-28 var_dump(date("Y-m-d", strtotime("first day of +1 month", strtotime("2020-08-31")))); //输出2020-09-01 var_dump(date("Y-m-d", strtotime("first day of next month", strtotime("2020-01-31")))); //输出2020-02-01 var_dump(date("Y-m-d", strtotime("last day of last month", strtotime("2020-03-31")))); //输出2020-02-28
If it is a version before 5.3, you can use mktime or the like to ignore all the days. For example, just limit them to the 1st of each month, but it is better to use the first day directly. More elegant.
Recommended tutorial: "PHP Video Tutorial"
The above is the detailed content of Dealing with PHP strtotime BUG. For more information, please follow other related articles on the PHP Chinese website!