현재 프로젝트 인터페이스를 작성 중입니다. 테스트 과정에서 서버에서는 정상적인 기능을 테스트했지만, 로컬에서는 항상 문제가 있었던 것으로 확인되었습니다. 단계별 조사 결과, 최종 잠금 문제는 strtotime 함수가 잘못된 값을 반환하여 데이터베이스에 데이터를 삽입하는 데 실패했기 때문에 발생했습니다.
동일한 코드라도 실행 결과가 다른 이유는 환경이 일관되지 않기 때문입니다. PHP 버전이 다르거나 비트 수가 다릅니다.
이 글은 주로 2038년 이후의 날짜를 변환하는 PHP 문제에 대한 해결책을 소개합니다. 이 글은 자세한 해결책을 제공하고 샘플 코드를 통해 누구나 쉽게 이해하고 배울 수 있도록 합니다. , 모두에게 도움이 되기를 바랍니다.
내 컴퓨터는 64비트입니다. PHP의 비트 수에 불일치가 있습니다. 서버는 64비트를 사용하는데, 내 로컬은 32비트입니다. 그리고 strtotime은 문자열 2050-1-1 23:59:59로 전달됩니다. 이 매개변수는 2038-1-19 03:14:07보다 크므로 32비트 PHP에서는 직접 false를 반환하지만 64비트 PHP에서는 영향력에 영향을 받지 않습니다.
Y2K38 취약점
위 문제의 근본 원인은 Unix Millennium Bug라고도 알려진 Y2K38 취약점입니다.
32비트 시스템 또는 PHP
이 취약점은 32비트 시스템에서 시간을 기록하기 위해 UNIX 타임스탬프 정수를 사용하는 모든 PHP 및 기타 프로그래밍 언어에 영향을 미칩니다. 정수형 변수를 저장할 수 있는 최대 시간은 2038년 1월 19일 03:14:07입니다. 이 시간을 초과하면 정수 값이 오버플로됩니다.
64비트 시스템 또는 PHP
64비트 시스템에서 저장할 수 있는 가장 먼 날짜는 현재 우주 나이의 21배인 292억년입니다. 따라서 이 취약점의 영향을 받지 않습니다.
탐지 방법
시스템이 이 취약점의 영향을 받는지 확인하는 방법입니다. 매우 간단합니다. strtotime을 사용하여 2038년 1월 19일 03:14:07보다 큰 날짜를 변환하면 됩니다. 또는 날짜 함수를 사용하여 2147454847보다 큰 타임스탬프를 날짜로 변환합니다.
다음은 자세한 데모입니다
방법 1
echo date("Y-m-d H:i:s",2556115199);
위 결과가 2050-12-31 23:59:59이면 문제 없습니다. 1914-11-25 09:31:43을 반환하면 영향을 받습니다.
방법 2
var_dump(strtotime("2050-12-31 23:59:59"));
위 결과가 2556115199를 반환하면 정상입니다. false가 반환되면 역시 영향을 받습니다.
해결 방법
옵션 1
시스템과 PHP를 64비트로 변경하세요. 이 비용은 상대적으로 높지만 문제를 영구적으로 해결할 수 있습니다.
옵션 2
PHP5.2 버전 이후에는 일시적으로 문제를 해결하기 위해 DateTime 함수가 제공됩니다.
// 1、日期字符串转换为时间戳 $obj = new DateTime("2050-12-31 23:59:59"); echo $obj->format("U"); // 2556115199 // 2、时间戳转换为日期字符串 $obj = new DateTime("@2556115199"); // 这里时间戳前要写一个@符号 $timezone = timezone_open('Asia/HONG_KONG'); // 设置时区 $obj->setTimezone($timezone); echo $obj->format("Y-m-d H:i:s"); // 2050-12-31 23:59:59 // 而且DateTime还可以有其他玩法 $obj = new DateTime("2050-12-31 23:59:59"); echo $obj->format("Y/m/d H:i:s"); // 换种方式输入时间字符串2050/12/31 23:59:59
DateTime 클래스를 통한 날짜 조작은 Y2K38 취약점의 영향을 받지 않으며 9999년 12월 31일까지 지원됩니다.
관련 권장 사항:
위 내용은 PHP에서 2038년 이후의 날짜를 변환할 때 오류를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!