在strtotime一个月的第一个工作日

时间:2010-12-05 05:15:03

标签: php datetime strtotime

我试图用strtotime找出某个月的第一个星期三,但是当第一个星期三恰好落在1号时,“第一个星期三”的论点就会失败。

有关此问题的更一般说明,请参阅以下代码和结果:

$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日的第二天,总是返回。

有人对此有解释吗?

6 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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如何影响日期计算过程:

  

同时观察“序数”中的“of”   空间日名空间''和''最后'   空间日名空间'''确实如此   特别的东西。

     
      
  1. 它将日期设置为1。
  2.   
  3. “ordinal dayname”的“不会提前到另一天。 (例:   “2008年7月的第一个星期二”意味着   “2008-07-01”)。
  4.   
  5. “ordinal dayname”确实进展到另一天。 (例如:“第一个   2008年7月2日“意思是”2008-07-08“,   另见上面列表中的第4点。
  6.   
  7. “''的''last'dayname'取当月的最后一个日期名称。   (例如:“2008年7月的最后一次婚礼”   指“2008-07-30”)
  8.   
  9. “'last'dayname”取自当天的最后一个日期名称。   (例如:“2008年7月上旬”是指   “2008-06-25”; “2008年7月”第一集   当前日期为“2008-07-01”和   然后“最后结婚”移到前一个   星期三是“2008-06-25”)。
  10.   

答案 3 :(得分:1)

我在PHP手册中找到了这个注释。

“在5.2.7之前的PHP 5中,在该工作日是该月的第一天的一个月中请求给定工作日的给定事件将错误地将一周添加到返回的时间戳。这已在5.2中更正.7及更高版本。“

答案 4 :(得分:0)

PHP 5.5.11

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

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

答案 5 :(得分:0)

我相信这是您放置值的顺序。 当您编写“ 2010年12月”时,它已经是2010年12月1日了。当添加“第一 {day}”功能在2010年12月1日之后的第一天生效。我认为,如果先声明“ first {day}”值,然后再声明“ 2010年12月”,则应该可以正常工作。