2012-06-07 75 views
3
$somedate = "1980-02-15"; 
$otherdate = strtotime('+1 year', strtotime($somedate)); 
echo date('Y-m-d', $otherdate); 

輸出添加幾年的日期重置爲1970-01-01

1981-02-15 

$somedate = "1980-02-15"; 
$otherdate = strtotime('+2 year', strtotime($somedate)); 
echo date('Y-m-d', $otherdate); 

輸出

1982-02-15 

$somedate = "1980-02-15"; 
$otherdate = strtotime('+75 year', strtotime($somedate)); 
echo date('Y-m-d', $otherdate); 

輸出

1970-01-01 

如何解決?

回答

5

這是2038 bug,它與y2k類似,由於32位限制,系統無法處理該年份之後的日期。改爲使用DateTime class解決此問題。

對於PHP 5.3+

$date = new DateTime('1980-02-15'); 
$date->add(new DateInterval('Y75')); 
echo $date->format('Y-m-d'); 

對於PHP 5.2

$date = new DateTime('1980-02-15'); 
$date->modify('+75 year'); 
echo $date->format('Y-m-d'); 
+0

如何〜75歲加入的「1980年2月15日的」使用日期時間類的指定字符串? – Zurechtweiser

+0

查看我的更新回答 –

+0

謝謝。我得到致命錯誤:調用未定義的函數date_add()。我正在使用PHP版本5.2.17。 – Zurechtweiser

0

從1980年起的75年是2055年,它已經超過了可以用32位整數表示的最高日期值。因此結果變成0,這是你觀察到的1970年的日期。

3

的strtotime()使用UNIX時間戳,因此它溢出,如果它試圖計算年超越2038,並恢復回到1970.

爲了解決這個問題,使用DateTime對象。 http://php.net/manual/en/book.datetime.php

要將一段時間添加到DateTime對象,請使用DateTime :: add,它將DateInterval作爲參數。 http://php.net/manual/en/datetime.add.php http://www.php.net/manual/en/class.dateinterval.php

$date = new DateTime("1980-02-15"); 
if (method_exists("DateTime", "add")) { 
    $date->add(new DateInterval("Y75")); 
} else { 
    $date->modify("+75 years"); 
} 
echo $date->format("Y-m-d"); 
+0

如何使用datetime類將75年添加到給定字符串「1980-02-15」? – Zurechtweiser

+0

@Richart Bremer添加了顯示如何操作的鏈接。 – Vulcan

+0

謝謝。我得到致命錯誤:調用未定義的方法DateTime :: add()。我正在使用PHP版本5.2.17。 – Zurechtweiser

1

對於Unix時間戳,表示的最大時間是2038年1月19日。在UTC時間03:14:07。

所以你不能通過使用時間戳表示/操作時間。

1

PHP的日期限於從01-01-1970到19-01-2038的範圍。您將不得不使用不同的方法處理日期。

PEAR有一個Date類:PEAR Date

相關問題