2012-07-02 100 views
1

我有一個mktime函數有趣的問題。我查看了之前在這裏提供的解決方案,沒有一個似乎得到解決或幫助(strotime不會改變我看到的結果)。mktime強制日期到1969年12月

我有一份月度報告,我正在努力爲用戶儘可能提供防錯功能,所以我只需要一個月和一年的時間。我將在代碼中提供報告的最佳日子。

我的表單有幾個月的下拉選項,而月份的值是兩位數的整數(01,02等)。年份是四位數字,由用戶手動填寫。

直到2038年,每件作品都非常出色......我知道,這是一段很長的路,但項目應該有20年的歷史,所以在過去的兩年裏,我是遇到問題。

這裏是我如何收到表格的信息:

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

然後,我用mktime的月和年與我的一天(27日)合併: $的timeStamp = mktime(0,0 ,0,$月份,27,$年);然後我把它賦給一個MySQL喜歡的日期形式的變量: $ reportdate = date('Y-m-j',$ timeStamp);

我回應了$月和$年的結果,他們正確地發現,但是當我回顯$ reportdate時,它總是說12/31/1969。

03 
2038 
1969-12-31 

無論我選擇哪個月都無所謂。 2037年12月完美報道,除此之外的任何事情都失敗

這是可以修復的東西嗎?或者我只是不得不說,這就是cookie崩潰的方式......?

回答

4

這是因爲您的時間戳已經溢出,並且是由year 2038 problem引起的。

基本上,整數表示爲帶符號的32位數,它可以保存最大值2147483648.所以,在UNIX時間戳中,這是一個以秒爲單位的特定量,大約是68年。

事實上,谷歌告訴我:

(2^31) * seconds = 68.0511039 years 

所以,UNIX時間戳是自UNIX新紀元的時候,1970年1月1日00:00:00 UTC,這意味着可以在32表示的最大日期位UNIX時間戳將有一年的:

1970 + ~68 = ~2038. 

如果您需要支持這些日期,使用DateTime類,因爲它並沒有這樣的限制,像這樣:

$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'); 
+0

是的。使用無符號整型而不是有符號整型。 – Johan

+0

PHP中沒有這樣的功能,因爲整數在內部表示爲signed。 – nickb

+0

這也是在文檔中解釋http://php.net/manual/en/function.mktime.php – Dancrumb

0

如上所述,您遇到了的2038問題。

幸運的是,它是可以修復的:不要使用mktime。以另一種方式構建您的$reportdate值,即不使用mktime。如:

$reportdate = $year."-".$month."-27"; 
相關問題