2010-12-05 97 views
10

我試圖找出使用strtotime的給定月份的第一個星期三,但是「第一個星期三」的論點在第一個星期三發生在第一個星期三的時候就失敗了。第一個星期幾在一個月的時間拍下

對於這個問題的更一般的說明,請參見下面的代碼和結果:

$mon = strtotime("December 2010 first monday"); 
$tue = strtotime("December 2010 first tuesday"); 
$wed = strtotime("December 2010 first wednesday"); 
$thu = strtotime("December 2010 first thursday"); 
$fri = strtotime("December 2010 first friday"); 
$sat = strtotime("December 2010 first saturday"); 
$sun = strtotime("December 2010 first sunday"); 

echo strftime("%m/%d/%y", $mon) . "<br>"; 
echo strftime("%m/%d/%y", $tue) . "<br>"; 
echo strftime("%m/%d/%y", $wed) . "<br>"; 
echo strftime("%m/%d/%y", $thu) . "<br>"; 
echo strftime("%m/%d/%y", $fri) . "<br>"; 
echo strftime("%m/%d/%y", $sat) . "<br>"; 
echo strftime("%m/%d/%y", $sun) . "<br>"; 

結果:

12/06/10 
12/07/10 
12/08/10 
12/02/10 
12/03/10 
12/04/10 
12/05/10 

注意些什麼呢?一週中的哪一天不應該與本月的第一天一致?但它永遠不會,而是在8日的第二天,總是會返回。

任何人都有對此的解釋?

回答

8

我沒有任何解釋,因爲我也眼花繚亂,但我設法找到了如何通過省略「第一」得到正確的日期,就像這樣:

$ php -r 'echo date("m/d/y", strtotime("December 2010 Wednesday"));' 
12/01/10 

$ php -r 'echo date("m/d/y", strtotime("December 2010 Thursday"));' 
12/02/10 

$ php -r 'echo date("m/d/y", strtotime("December 2010 Friday"));' 
12/03/10 

$ php -r 'echo date("m/d/y", strtotime("December 2010 Saturday"));' 
12/04/10 

$ php -r 'echo date("m/d/y", strtotime("December 2010 Sunday"));' 
12/05/10 

$ php -r 'echo date("m/d/y", strtotime("December 2010 Monday"));' 
12/06/10 

$ php -r 'echo date("m/d/y", strtotime("December 2010 Tuesday"));' 
12/07/10 
+0

果然,這個工程。讓我們不要問爲什麼... – Yarin 2010-12-05 05:45:57

+0

好吧,你可以看看PHP源代碼,如果你真的好奇,至於我,讓我們繼續前進:D – 2010-12-05 05:47:19

5

這只是你的格式不正確。您需要包括of

echo strftime("%m/%d/%y", strtotime("first Monday of December 2010")); 
echo strftime("%m/%d/%y", strtotime("first Tuesday of December 2010")); 
echo strftime("%m/%d/%y", strtotime("first Wednesday of December 2010")); 
echo strftime("%m/%d/%y", strtotime("first Thursday of December 2010")); 
echo strftime("%m/%d/%y", strtotime("first Friday of December 2010")); 
echo strftime("%m/%d/%y", strtotime("first Saturday of December 2010")); 
echo strftime("%m/%d/%y", strtotime("first Sunday of December 2010")); 

打印:

12/06/10 
12/07/10 
12/01/10 
12/02/10 
12/03/10 
12/04/10 
12/05/10 

接受的解決方案的工作,但如果你想找到第二個星期,你會遇到的問題:

echo strftime("%m/%d/%y", strtotime("December 2010 second Wednesday")); 

打印:

12/15/10 

有在文檔給出一些例子:

http://www.php.net/manual/en/datetime.formats.relative.php

的筆記上述文檔中的第二塊說明如何of影響日期計算過程:

還觀察到「的「in」序號 空間dayname空間'''和''最後' 空間dayname空間'''確實 東西特別。

  1. 它集日的日到1
  2. 「序DAYNAME‘的’」不會進到另一天。 (例如: 「2008年7月第一個星期二」意味着 「2008-07-01」)。
  3. 「順序日期名稱」確實推進到另一天。 (例如:「第一個 星期二2008年7月」意味着「2008-07-08」, 另請參見上面列表中的第4點)。
  4. ''''''''''''''''取當前月份的最後一天的名稱。 (例如:「2008年7月的最後一天」 表示「2008-07-30」)
  5. 「'last'dayname」取當天的最後一天的名稱。 (例如:「2008年7月」是指 「2008-06-25」;「2008年7月」第一套 當前日期爲「2008-07-01」和 ,則「上一次結婚」移至前一次 星期三是「2008-06-25」)。
10

構建所提供的答案,需要了解在php 5.2和php 5.3之間的相對日期格式差異。

TEST:

$date1 = strtotime("first wednesday of 2010-12"); 
$date2 = strtotime("first wednesday 2010-12"); 
$date3 = strtotime("wednesday 2010-12"); 

5.2結果:

1969-12-31 
2010-12-08 
2010-12-01 

5.3結果:

2010-12-01 
2010-12-08 
2010-12-01 

因此,只有第第三種方法在PHP 5版本中返回正確的結果。

1

我在PHP手冊中發現了這個註釋。 「

」在5.2.7之前的PHP 5中,請求某個特定工作日的某個發生日期(該工作日是該月的第一天)將錯誤地將一週添加到返回的時間戳。 5.2.7及更高版本「。

0

PHP 5.5.11

$firstWeekdayOfMonth = new DateTime('first weekday 0 jun 2016');

我不知道爲什麼,但零那種力量的strtotime解析器在月初開始考慮的第一天。

相關問題