不知道為什麼客戶都喜歡訂單編號的格式使用「年月日+本日訂單數量流水號」,也許是因為好找訂單吧

但為了防止意外我都習慣在「年月日+本日訂單數量流水號」 後面在加個隨機碼,避免發生重複訂單號的機率

不過,客戶們似乎都不喜歡==


進入正題

為了取得當日的訂單數量我通常採用 

//取的目前時間的timestamp 

$now = getNowTime();

//當天 00:00:00 的 timestamp

$start_time = strtotime(gmdate("Y-m-d 00:00:00",$now));

//當天 23:59:59 的 timestamp

$end_time = strtotime(gmdate("Y-m-d 23:59:59",$now));

這樣看起來代碼上沒問題,但執行起來得到的 timestamp 卻跟實際的 timestamp 有所出入

經過我的測試後發現到原因出現在 strtotime 轉換錯誤,遇到的狀況大約長這樣


strtotime("2017-03-30 23:59:59");

理論上應該得到這個值 1490918399 但卻獲得 1490914799 整整差了一個小時

起初想說既然固定差一個小時,那就自己再補上3600就好了,的確問題真的解決了。

但是事情沒那麼簡單,因為最近卻又發現在抓取訂單號時,竟然又出現訂單數量計算錯誤導致取號重複的問題

再次進行測試後,發現到誤差值從原本的 3600 變成 7200 ,只好上網爬文看看是否有一勞永逸的解決辦法

最終讓我找到可以透過這個設定

date_default_timezone_set('UTC'); 

strtotime 轉換出來的timestamp 就會正常了,不需要再自行加3600或7200之類的...


還有一點,那就是我開發是用MVC架構但我將 date_default_timezone_set('UTC'); 添加在index.php 不曉得為何沒全局有效(也可能是個案),保險起見還是加完後測試一下或乾脆在使用strtotime的上方添加date_default_timezone_set('UTC'); 


例如:

 date_default_timezone_set('UTC');

 echo strtotime("2017-03-30 23:59:59");



文章轉載或引用,請先告知並保留原文出處與連結!!(單純分享或非營利的只需保留原文出處,不用告知)

原文連結:
https://blog.aidec.tw/post/strtotime-timestamp-error