php计算时间顺延3分,PHP关于strtotime函数的大坑
2020/04/30 早上上班的時候看到系統里過去半年每個月賬單記錄里,出現了兩次202003,少了202002的記錄,比較奇怪就查了下前端代碼,是從后端php使用strtotime獲取的。
項目中使用了如下的代碼來獲取過去半年的月份,然后通過這六個月份來依次查賬單:
this->month = array(
date('Ym'),
date('Ym',strtotime('last month')),
date('Ym',strtotime('2 months ago')),
date('Ym',strtotime('3 months ago')),
date('Ym',strtotime('4 months ago')),
date('Ym',strtotime('5 months ago')),
date('Ym',strtotime('6 months ago')),
);
比較疑惑為什么會獲取到兩次2020年3月,就測試了下strtotime這個方法的last month;發現這個方法有一個大坑就是他并不會判斷大月小月,更不會判斷閏年平年,而是默認直接給當前的月份數字減一;在大月的最后一天,以及閏年的二月最后一天等特殊日期均會出現類似bug。
對該函數做了一次完整測試,結果如下圖:
strtotime相關測試結果
可以看到3月30日的一個月前2月30日,但2020年2月只有29日所以直接被順延到3月1日,然后再次取回Ym就變成了3月的前一個月還是3月。
查了一下相關資料,php對此給出的解決辦法是在php版本5.3之后date新增了一系列修正的短語來明確這個問題,那就是'the first day of'和‘the last day of’,如圖中的
m4表示的,就能夠正確的把4月30日的兩個月前指向2月29日,然后使用Ym可表示為202002,即可正確獲取到想要的結果。如下圖:
php 5.3之后可用的解決辦法
這樣就能夠解決大小月和平閏年帶來的月份問題了。
總結
以上是生活随笔為你收集整理的php计算时间顺延3分,PHP关于strtotime函数的大坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php并行运算,php多进程并行执行脚本
- 下一篇: 光头阳线预示着什么