>백엔드 개발 >PHP 튜토리얼 >PHP strtotime BUG 다루기

PHP strtotime BUG 다루기

coldplay.xixi
coldplay.xixi앞으로
2020-06-08 10:26:043848검색

PHP strtotime BUG 다루기

PHP strtotime의 버그 처리

최근 -1month, +1month,nextmonth와 결합하여 strtotime을 사용하여 이전 달 또는 다음 달의 날짜를 가져오는데 방금 기사를 보고 깨달았습니다. 원본 strtotime을 사용하여 날짜를 직접 가져오는 데 여전히 작은 버그가 있습니다

BUG

예를 들어 date:

$today = '2020-12-31';
echo date("Y-m-d",strtotime("$today -1 month"))

Output

2020-12-01

위 출력에 따르면 여전히 출력이 유지되는 것을 볼 수 있습니다. 2020년 12월

분석:

먼저 Do -1개월, 현재 시간은 07-31이고, 하나를 빼면 06-31이다.

6월에는 31일이 없기 때문에 다시 날짜 정규화를 하라. , 2시 60분은 3시와 같으며 6월 31일은 7월 1일과 같습니다

논리가 매우 "명확"합니까? 다음과 같이 두 번째 단계를 수동으로 확인할 수도 있습니다.

var_dump(date("Y-m-d", strtotime("2020-12-31")));
// 输出2020-12-01

즉 , 크고 작은 달의 마지막 날이 포함되는 한 이러한 혼란이 있을 수 있습니다. 다른 달도 비슷한지 쉽게 확인할 수 있으며 다음 결론을 확인할 수 있습니다.

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

PHP5.3부터 시작, 날짜 이 문제를 명확히 하기 위해 일련의 정정 문구, 즉 "첫 번째 날"과 "마지막 날"을 추가했습니다. 즉, 날짜가 자동으로 "정규화"되지 않도록 날짜를 제한할 수 있습니다:

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 5.3 이전 버전이므로 mktime 등을 사용하여 모든 날짜를 무시할 수 있습니다. 예를 들어 매월 1일로 제한하면 충분하지만 첫날을 직접 사용하는 것만큼 우아하지는 않습니다

. 추천 튜토리얼: "PHP 비디오 튜토리얼"

위 내용은 PHP strtotime BUG 다루기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 liqingbo.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제