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 중국어 웹사이트의 기타 관련 기사를 참조하세요!