11

我正在尝试使用 找出给定月份的第一个星期三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 号。

有人对此有解释吗?

4

6 回答 6

10

根据提供的答案,需要注意 php 5.2 和 php 5.3 之间相对日期格式的差异。

测试:

$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 版本中返回正确的结果。

于 2010-12-07T17:40:26.890 回答
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
于 2010-12-05T05:37:55.013 回答
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影响日期计算过程:

还要注意“序数空间 dayname space 'of'”和“'last' space dayname space 'of'”中的“of”做了一些特别的事情。

  1. 它将日期设置为 1。
  2. "ordinal dayname 'of'" 不会提前到另一天。(例如:“2008 年 7 月的第一个星期二”表示“2008-07-01”)。
  3. “ordinal dayname”确实提前到另一天。(例如:“2008 年 7 月第一个星期二”表示“2008-07-08”,另请参见上面列表中的第 4 点)。
  4. "'last' dayname 'of'" 采用当前月份的最后一天名称。(例如:“2008 年 7 月的最后一个星期三”表示“2008-07-30”)
  5. "'last' dayname" 取当天的最后一个 dayname。(例如:“2008 年 7 月最后一个星期三”表示“2008 年 6 月 25 日”;“2008 年 7 月”首先将当前日期设置为“2008 年 7 月 1 日”,然后“最后一个星期三”移动到上一个星期三,即“2008 -06-25 英寸)。
于 2010-12-05T08:55:23.950 回答
1

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

“在 5.2.7 之前的 PHP 5 中,在该工作日是该月的第一天的月份中请求给定工作日的给定事件会错误地将一周添加到返回的时间戳。这已在 5.2.7 和以后的版本。”

于 2011-03-08T04:04:50.150 回答
0

PHP 5.5.11

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

我不知道为什么,但是考虑到第一天,零类强制 strtotime 解析器在月初开始。

于 2016-08-25T19:31:44.810 回答
0

我相信这是您放置价值的顺序。当你写“2010 年 12 月”时,它已经是 2010 年 12 月 1 日。添加“first {day}”时,函数适用于 2010 年 12 月 1 日之后的第一天。我认为如果您声明“第一个 {day}”值,然后声明“2010 年 12 月”,它应该可以正常工作。

于 2019-12-13T18:32:19.027 回答