2016-03-31 49 views
2

在過去的一年裏,這段代碼有效。使用strtotime不可預知的在PHP中獲取日期?

我認爲唯一改變的是它是一個閏年的事實。我試圖在網上找到類似的問題,但無法弄清楚。

假設我在3月30日運行此,2016年

這裏有5條線的PHP。

echo date("F",strtotime("-4 month")); 
echo date("F",strtotime("-3 month")); 
echo date("F",strtotime("-2 month")); 
echo date("F",strtotime("-1 month")); 
echo date("F"); 

這些回波在接下來的幾個月:

December 
December 
January 
March 
March 

爲什麼會出現這種情況? 我在http://sandbox.onlinephpfunctions.com上搞砸了很多,甚至看到如果你做-5個月,它會打印十月。

我在這個函數的運行中肯定缺少一些東西。任何人都可以向我解釋/ etc的限制嗎?我想更多地瞭解它爲什麼不起作用。

+0

復活從[這裏](http://stackoverflow.com/questions/28218413/strtotime-result-makes-no-sense-php-bug#comment44816201_28218533)評論, _這就是爲什麼php的strtotime既驚人又可怕的同時 - yuvi_ – Chay22

回答

0

Derick Rethans

一遍又一遍PHP用戶抱怨說,下個月在PHP的日期字符串解析器不會進入下個月,而是跳到下個月後的那個;如下例所示:

<?php 
$d = new DateTime('2010-01-31'); 
$d->modify('next month'); 
echo $d->format('F'), "\n"; 
?> 

小腳本的輸出將爲3月。 3月顯然不會在1月份之後,因爲2月份之間。但是,目前的行爲是正確的。以下情況發生在內部:

  • 下個月將月份數字(原爲1)加1。這 使日期2010-02-31。

  • 第二個月(二月)在2010年只有28天,所以PHP通過繼續計算從2月1日起的天數來自動修正此問題。然後你在3月3日結束。

  • 格式化日期和年份,導致輸出3月。呼應採用了全日期格式,將輸出2010年3月3日的日期

這可以很容易地看到:

<?php 
echo $d->format('F jS, Y'), "\n"; 
?> 

要獲得正確的行爲,你可以使用一些PHP 5.3的介紹相對時間節的新功能。本節可與下個月,第五個月或+8個月結合使用,以轉到指定月份的第一天。而不是從前面的例子中的下個月,我們在下個月的第一天在這裏:

<?php 
$d = new DateTime('2010-01-08'); 
$d->modify('first day of next month'); 
echo $d->format('F'), "\n"; 
?> 

此腳本將正確輸出2月。當PHP處理下個月的第一天時,下面的事情發生:

  • 下個月將月份數(原爲1)增加1。這 使日期2010-02-31。

  • 將第一天的天數設置爲1,導致日期爲2010-02-01。

  • 格式化日期和年份,導致輸出2月。

除了第一天,還有一個等同的最後一天去一個月的最後一天。下面的例子說明了這一點:

<?php 
$d = new DateTime('2010-01-08'); 
$d->modify('last day of next month'); 
echo $d->format('F jS, Y'), "\n"; 
?> 

此輸出2月28日,2010年國內將出現以下情況:

  • 下個月增加1個月數量(最初爲1)。這使得日期2010-02-08。

  • 最後一天將月份數字加1,並將天數設置爲0,導致日期2010-03-00。

  • 然後,PHP會自動更正無效日期編號0,從月份中刪除一個並跳到該月份的最後一天,從而導致2010-02-28。

我希望這清除了PHP的日期/時間處理的一些行爲。

0

我會建議你去嘗試,而不是以下:

echo date("F", strtotime("-4 month", strtotime(date("F") . "1"))); 
echo date("F", strtotime("-3 month", strtotime(date("F") . "1"))); 
echo date("F", strtotime("-2 month", strtotime(date("F") . "1"))); 
echo date("F", strtotime("-1 month", strtotime(date("F") . "1"))); 

你面臨的問題是由於PHP bug

希望這有助於。

0

你能做到這一點,我認爲這是相當整潔:

echo date("F", strtotime('first day of -4 month')); 
echo date("F", strtotime('first day of -3 month')); 
echo date("F", strtotime('first day of -2 month')); 
echo date("F", strtotime('first day of -1 month')); 
echo date("F"); 

例如: https://3v4l.org/LjUCE

0

試試這個:

for($i=5;$i>0;$i--) { 
echo date("F", strtotime("-".$i." month", strtotime(date("F") . "1"))); 
}