2009-09-15 49 views
1

我正在使用unix時間戳作爲我在日期範圍查詢中使用的起始日期的基礎。開始日期不是問題,就本例而言,我將使用以下時間戳:1228089600(2008年12月1日00:00:00)。PHP - date()減少bug?

對於我的查詢中使用我所需要的任何給定月份的最後一天,很容易找出到最後一秒所以..

date('o-m-d G:i:s',mktime(0, 0, -1, date("m",1228089600)+1, 1, date("o",1228089600))); 

這種方法已經工作正常,我每隔一個月除12月..通過開始日期,增加整個月份(2009年1月1日00:00:00),然後帶走1秒我期待導致我需要的日期(2008年12月31日23時59分59秒)。然而,看起來今年的計算是正確的額外的一個月,但不是減去秒,因爲返回的日期是2009年12月31日23時59分59秒。

正如我所說,這種方法一直很好,直到我發現這個問題。但這是一個問題,我無法找出原因或簡單的解決方案..

任何幫助,非常感謝。

回答

2

這是因爲:

標誌 'O' - ISO-8601年份數字。除了如果 ISO周編號(W)屬於 上一年或下一年,則該年的 值與Y的值相同,但替代地使用該年的 。 (在PHP 5.1中添加。0)

所以你的情況會發生這樣的:產生

  1. 日期是1 2009年1月
  2. 日期減爲1秒(所以你得到31 2008年12月)
  3. 但隨着雲以上描述 - 本週屬於2009所以2009年退回,而不是2008年

(屬於年意味着:更多的星期幾在2009年t在2008年的情況下 - 在上述情況下:2008年3天(週一,週二,週三,週三,週三,週三)和週四週四(週四,週五,週日,週一,週二,週三,週四))

1

這確實似乎是與如何mktime()現在處理一個「月」值大於12

php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 2, 1, 2008)); 
2008-01-31 23:59:59 
php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 3, 1, 2008)); 
2008-02-28 23:59:59 
php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 1, 1, 2008)); 
2007-12-31 23:59:59 

php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 13, 1, 2008)); 
2009-12-31 23:59:59 
php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 13, 1, 2007)); 
2008-12-31 23:59:59 

你最好的選擇錯誤可能是隻檢查從date('m', ...)+1自己和special-輸出時的運算,如果結果是13

0

試試這個:

$start = 1228089600; 
$number_of_days_in_month = date('t', $time); 
$end = strtotime('+' . $number_of_days_in_month . ' days', $start) - 1; 
// subtract one second to get 23:59:59 or don't to get 00:00:00. 
// Also note that there can be a leap second. 
// $end = $start + $number_of_days_in_month * 86400 - 1; would probably work as well. 

echo date('o-m-d G:i:s', $end); 
1

我並添加一些例外,以減少年如果這個月是一月份,但是我還有另一個日期範圍,這個日期範圍是與GA api一起使用的。儘管方法相似,但我很驚訝地看到這個日期範圍很好。所不同的是..

問題的:

date('o-m-d G:i:s',mktime(0, 0, -1, date("m",1228089600)+1, 1, date("o",1228089600))); 

精細:

date('Y-m-d G:i:s',mktime(0, 0, -1, date("m",1228089600)+1, 1, date("Y",1228089600))); 

所以使得開關似乎已經解決了這個問題。

希望這一切都可能對某個人有用,有一天。