2012-07-02 1 views
1

mktime 함수에 흥미로운 문제가 있습니다. 이전에 여기에 제공된 솔루션을 살펴 보았지만 아무도 해결되거나 도움이되지 않는 것으로 나타났습니다 (스트로 타임은 내가 보는 결과를 변경하지 않습니다).mktime의 날짜가 1969 년 12 월입니다.

나는 가능한 한 오류를 방지하기 위해 월간 보고서를 작성하고 있으므로 한 달과 1 년만을 요청하고 있습니다. 나는 그 보고서에서 가장 좋은 날을 코드에 제공 할 것이다.

내 양식에 달에 대한 드롭 다운 선택이 있고 그 달의 값은 두 자리 정수 (01, 02 등)입니다. 연도는 4 자리 숫자로 사용자가 직접 입력합니다.

모든 작품은 2038 년까지 훌륭합니다 ... 나도 알아, 그게 먼 길을 알지만,이 프로젝트는 20 년 범위가 있어야하고 지난 2 년 동안 문제가 발생했습니다. 그런 다음

$month = filter_var($_POST["month"], FILTER_SANITIZE_NUMBER_INT); 
$year = filter_var($_POST["year"], FILTER_SANITIZE_NUMBER_INT); 

, 내 일 (27 일)로 월과 연도를 결합한다 mktime를 사용 : $ 때문에, timeStamp = mktime은 (0,0 여기

내가 양식에서 정보를 수신하고있어 방법 , 0, $ month, 27, $ year);

그런 다음 MySQL을 좋아하는 날짜 형식의 변수에 할당합니다. $ reportdate = date ('Y-m-j', $ timeStamp);

나는 $ month와 $ year의 결과를 되풀이하여 올바르게 전달하지만 $ reportdate를 출력하면 항상 1969 년 12 월 31 일이라고합니다.

03 
2038 
1969-12-31 

내가 선택한 달은 중요하지 않습니다. 2037 년 12 월 보고서는 완벽하게보고합니다.

고칠 수있는 것입니까 아니면 쿠키가 무너지는 것입니까?

답변

4

타임 스탬프가 넘치고 year 2038 problem이 원인이기 때문입니다.

기본적으로 정수는 최대 값 2147483648을 유지할 수있는 부호있는 32 비트 숫자로 표시됩니다. 따라서 UNIX 시간 소인에서 이는 약 68 년 동안의 특정 양 (초)입니다. 사실

, 구글은 나에게 말한다 :

(2^31) * seconds = 68.0511039 years 

그래서, UNIX 타임 스탬프는 UNIX의 시대 이후 시간, 월 1는 1970 0시 0 분 0 초 인 UTC 32으로 표현 될 수있는 가장 큰 날짜를 의미

$date = new DateTime("now", new DateTimeZone('America/New_York')); 
$date->setDate($year, $month, 27); 
// $date->setTime(0, 0, 0); 
echo $date->format('Y-m-j'); 
:이 같은 제한,과 같이되어 있지 않는 한, 당신은이 날짜를 지원해야하는 경우

1970 + ~68 = ~2038. 

에서, DateTime 클래스를 사용 : 비트 UNIX 타임 스탬프의 연간 것

+0

예. 서명 된 int 대신 부호없는 int를 사용하십시오. – Johan

+0

정수는 내부적으로 부호로 표시되므로 PHP에는 이러한 기능이 없습니다. – nickb

+0

이것은 문서에도 설명되어 있습니다. http://php.net/manual/en/function.mktime.php – Dancrumb

0

위에서 설명한 것처럼 mktime으로 2038 문제가 발생했습니다.

다행히도, 고칠 수 있습니다. mktime을 사용하지 마십시오. $reportdate 값을 다른 방법으로 작성하면 mktime은 사용되지 않습니다.예 :

$reportdate = $year."-".$month."-27";