PHP 關於strtotime('- x month') bug的解決

高洛峰
發布: 2016-11-22 17:16:18
原創
1625 人瀏覽過

之前在開發專案時,遇到過用strtotime("- 1 month")會出現bug的情況,主要原因是PHP預設設定的時間是以格林威治時區為標準的,有兩種方法解決這個問題,一是在php.ini修改預設的時區,二是在程式中設定

首先說下第一種方法吧,在php.ini中修改預設的時區

我用的wamp整合環境,之前一直以為是在bin/php/php5.5.12進行修改預設時區,但無論怎麼修改都還是顯示的格林威治時區的時間,並且網上沒有查找到對應的解決辦法,後來在bin/apache/apache2.4.9 /bin中查找到了一個php.ini文件,設定該文件的時區為date.timezone = PRC,則在頁面上顯示是和我係統時間是一樣的。

設定的方法是在php.ini檔案中對修改時區為我們地區的時間,如修改date.timezone = PRC則表示將時間設定為中華人民共和國時間,也就是當前我們系統的時間,注意:為了使我們設定的時區生效,需要去掉前面的;。

第二種方法是在程式中加入date_default_timezone_set('PRC');

date_default_timezone_set('PRC');//此句用於消除時間差H:i:s");

echo $date; //輸出

?>

這樣就可以在輸出我們目前的時間了。

現在出現了另一個問題,在時間為2016-03-31時,在用上面的方法獲取上一個月的時間時,獲取到的時間還是2016-03,初步設想是因為這個方法是先查找上個月的天數,然後在使用今天的時間減去上個月天數。

以下有幾種方法,可以幫助我們達到預期效果,例如我要回到上個月的月份:

echo date('Y-m', strtotime('midnight first day of -1 month'));
或:
echo date('Y-m', strtotime(date('Y-m-01')) – 86400);

或在程式中做以下處理

date_default_timezone_set('Asia/Shanghaihai) ;
$first_day_of_month = date('Y-m',time()) .'-01 00:00:01';
$t = strtotime($first_day_of_month);
print_r(array(
m月',$t),date('Y年m月',strtotime('- 1 month',$t)),

date('Y年m月',strtotime('- 2 month',$ t)),
));
?>

這樣做的原理是將每個月時間的年和月分離出來,然後在後面添加上日和時分秒,這樣在做strtotime('- 1 month' ,$t)操作時,就可以顯示上個月的時間了。

另外在提一個注意事項:

在用strtotime(date("Y-m-d h:i:s"))做時間處理時,這裡的字母是區分大小寫的,

h是區分大小寫的,小寫h輸出的是時區的小時,17點就是5點。而大寫H是輸出17的,

而且年份y的大小寫是有區別的,小寫y輸出的是13。大寫Y輸出的是2013。

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板