如果引用或轉貼,麻煩註明出處與本網誌連結,否則視為侵權。

2021年9月2日

如何解決PHP日期2038年的限制?

作者: Fred F.M. Wang (FW知識瑣記) 日期:2021-9-2

以往以PHP寫日期相關程式,習慣用strtotime函式將字串轉換為時間,並用date函式以特定的日期

格式顯示出來。但是最近遇到了2038年後的日期顯示出問題了。如何解決呢? 


舊寫法 :


$date = date("Ymd",strtotime("2038-1-19"));

echo "2038-1-19 :" . $date . "<br />";     

使用日期(date)函式,結果顯示 2038-1-19 :20380119        


$date = date("Ymd",strtotime("2038-1-20"));

echo "2038-1-20 :" . $date . "<br />";   

使用日期(date)函式, 結果顯示 2038-1-20 :19700101            

由此看到日期(date)函式2038年1月20日之後的日期都無法正確顯示了


同樣要顯示日期增減也是會發生同樣的問題,當日期增加超過2038-1-20日,就無法顯示出來。

$this_date = Date("Ymd");

echo "today:" . $this_date . "<br />"; // 顯示 today:20210831


$date = date("Ymd",strtotime("+5985 days", strtotime($this_date)));

echo "add 5985 days:" . $date . "<br />"; // 顯示 add 5985 days:20380119


$date = date("Ymd",strtotime("+5986 days", strtotime($this_date)));

echo "add 5986 days:" . $date . "<br />";  // 顯示 add 5986 days:19700101        

    

怎麼解決2038年的限制呢?


您必須改用DateTime函式來取得日期(將日期字串轉成日期),並用format函式以特定的日期格式

顯示出來

$date =  new DateTime($this_date);


日期的增加則使用add函式

$date->add(new DateInterval("P6000D"));  // P開頭代表日期,6000D 代表 6000 天

echo "add 6000 days:" . $date->format("Ymd"); // add 6000 days:20380203

 

沒有留言:

張貼留言

歡迎提供意見, 謝謝 (註 : 留言經過版主審核通過才會發布)