Dealing with PHP strtotime BUG

coldplay.xixi
Release: 2023-04-08 19:04:01
forward
3807 people have browsed it

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"))
Copy after login

Output

2020-12-01
Copy after login

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
Copy after login

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
Copy after login

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
Copy after login

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!

Related labels:
source:liqingbo.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template