第一个星期几在一个月的时间拍下

问题描述:

我试图找出使用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日的第二天,总是会返回。

任何人都有对此的解释?

我没有任何解释,因为我也眼花缭乱,但我设法找到了如何通过省略“第一”得到正确的日期,就像这样:

$ 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

这只是你的格式不正确。您需要包括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”)。

构建所提供的答案,需要了解在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版本中返回正确的结果。

我在PHP手册中发现了这个注释。 “

”在5.2.7之前的PHP 5中,请求某个特定工作日的某个发生日期(该工作日是该月的第一天)将错误地将一周添加到返回的时间戳。 5.2.7及更高版本“。

PHP 5.5.11

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

我不知道为什么,但零那种力量的strtotime解析器在月初开始考虑的第一天。