Home  >  Article  >  Backend Development  >  Dealing with PHP strtotime BUG

Dealing with PHP strtotime BUG

coldplay.xixi
coldplay.xixiforward
2020-06-08 10:26:043774browse

Dealing with PHP strtotime BUG

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!

Statement:
This article is reproduced at:liqingbo.cn. If there is any infringement, please contact admin@php.cn delete