strtotime函數在是大家常用的一個時間日期轉換成單位S的一個函數了,但是這個函數有一個細節大家可能沒有注意到,就是 使用的時候需要考慮 有31天和 2月份的情況,所以,如果沒有考慮這個特殊的情況,那么在每月的31號或者和2月份有關的時間點時候就可能出現開始的那個靈異情況了,這個情況很多朋友都不記得了,但在很多時間這個非常重要,下面舉例子來給各位介紹一下.
今天在微博上看到一個小案例,命令行如下:
php -r “echo date(‘Y/m’,strtotime(‘-2 months’)) . \”\n\”;”
輸出結果如下:2013/03
如果把命令行修改成如下:
php -r “echo date(‘Y/m’,strtotime(‘-3 months’)) . \”\n\”;”
輸出結果如下:2013/03
這里就奇怪了,怎么兩個月前和三個月前的年月份都是一樣的,再看看下面的命令行:
php -r “echo date(‘Y/m’,strtotime(‘-3 months’,strtotime(’2013/05/28′))) . \”\n\”;”
輸出結果如下:2013/02
如果修改命令行為如下:
php -r “echo date(‘Y/m’,strtotime(‘-3 months’,strtotime(’2013/05/29′))) . \”\n\”;”
輸出結果如下:2013/03
下面這個與預期的結果是一樣的,現在說說為什么會出現開始的那個奇怪的坑.
strtotime里的months和 month是30天,使用的時候需要考慮 有31天和 2月份的情況,所以,如果沒有考慮這個特殊的情況,那么在每月的31號或者和2月份有關的時間點時候就可能出現開始的那個靈異情況,這個算是strtotime的一個坑吧,為了慎重起見,能不用的時候就盡量別去用這個坑人的東東.
PS:以上所有例子都是在Debian6的64位系統下執行,使用命令行方式執行,執行時間是2013-05-30.
上月下月時間不準確
以下有幾種方法,可以幫助我們達到預期效果,比如我要返回上個月的月份,代碼如下:
- echo date('(www.companysz.com)M Y', strtotime((www.companysz.com)'midnight first day of -1 month'));
- 或者:
- echo date('M Y', strtotime(date('Y-m-01')) - 86400);
下方是其他的用途,代碼如下:
- strtotime('first day of last month');
- strtotime('last day of last month');
- strtotime('first of last week');
- strtotime('first of this week');
- strtotime('this week midnight'); // returns Monday midnight of this week
- strtotime('last week midnight'); // returns Monday midnight of last week
- strtotime('last week Sunday midnight'); // returns Sunday midnight of this week
- strtotime('-2 weeks Sunday midnight'); // returns Sunday midnight of last week
- <?php
- date_default_timezone_set('Asia/Shanghai');
- $first_day_of_month = date('Y-m',time()) . '-01 00:00:01';
- $t = strtotime($first_day_of_month);
- print_r(array(
- date('Y年m月',$t),
- date('Y年m月',strtotime('- 1 month',$t)),
- date('Y年m月',strtotime('- 2 month',$t)),
- ));
- ?>
新聞熱點
疑難解答