2012-05-10 85 views
1

我使用的PHP版本5.3.8 而mktime是不是爲我工作mktime不是爲年工作大於2038

這裏是代碼

$dated= mktime(0,0,0,11,5,2038); 
var_dump($dated); 

輸出是布爾(假) 請給我建議的修復

+2

向64位PHP建議更新或使用DateTime對象作爲與32位限制 –

+0

完全一致的最大有效年限限制之外的哈希性日期值的方式:) – deex

回答

3

PHP manual

乙在PHP 5.1.0之前,負面時間戳在任何 已知版本的Windows和其他一些系統中都不受支持。因此, 範圍的有效年限是通過2038

一個可能的解決方案僅限於1970年是使用ADOdb Date Time Library。該庫通過用PHP浮點數(通常爲64位)替換本機函數的有符號整數(通常爲32位)來克服限制。

+4

請問我有什麼不好的? –

4

mktime返回時間戳,它是一個整數(在PHP中它實際上是一個有符號整數)。因此,32位系統的最大可能時間戳爲19 Jan 2038 03:14:07 UTC(之後發生整數溢出)。對於更大的時間戳,你需要一個64位整數。

2

有關使用C/C++庫轉換時間的三件重要事情。

標準庫中的gmtime()或localtime()將time_t轉換爲struct tm,但time_t的分辨率是來自epoch的秒數。所以小數秒不會計數。

mktime()從struct tm向後轉換爲time_t,但如果輸入日期超出範圍,它將返回-1。 (請參閱年份2038問題:http://en.wikipedia.org/wiki/Year_2038_problem

如果您不使用64位時間戳,即使您在64位計算機上運行程序,仍然存在2038年問題。有64位版本的功能,如gmtime64(),localtime64(),mktime64()可能會解決年度超出範圍問題。 (請參考頁面:http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frtref%2Fmktime64.htm

使用boost庫無法解決2038年問題的答案。注意從它的頁面:「內部boost :: gregorian :: date存儲爲32位整數類型。」