首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用strtotime获取一个月内的第一个工作日

使用strtotime获取一个月内的第一个工作日
EN

Stack Overflow用户
提问于 2010-12-05 13:15:03
回答 6查看 12K关注 0票数 11

我正在尝试使用strtotime计算给定月份的第一个星期三,但是只要第一个星期三恰好落在第一个星期三,“第一个星期三”的论点就会失败。

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

代码语言:javascript
运行
复制
$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>";

结果如下:

代码语言:javascript
运行
复制
12/06/10
12/07/10
12/08/10
12/02/10
12/03/10
12/04/10
12/05/10

注意到什么了吗?一周中的某一天不应该和这个月的第一天重合吗?但它从来没有这样做过,而是在8号返回当天的第二个实例。

有人对此有什么解释吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-12-05 13:37:55

我没有任何解释,因为我也很眼花缭乱,但我设法找出了如何通过省略"first“获得正确的日期,如下所示:

代码语言:javascript
运行
复制
$ 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
票数 8
EN

Stack Overflow用户

发布于 2010-12-08 01:40:27

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

测试:

代码语言:javascript
运行
复制
$date1 = strtotime("first wednesday of 2010-12");
$date2 = strtotime("first wednesday 2010-12");
$date3 = strtotime("wednesday 2010-12");

5.2结果:

代码语言:javascript
运行
复制
1969-12-31
2010-12-08
2010-12-01

5.3结果:

代码语言:javascript
运行
复制
2010-12-01
2010-12-08
2010-12-01

因此,只有第三个方法在PHP5版本中返回正确的结果。

票数 10
EN

Stack Overflow用户

发布于 2010-12-05 16:55:24

只是你的格式不正确。您需要包含of

代码语言:javascript
运行
复制
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"));

打印:

代码语言:javascript
运行
复制
12/06/10
12/07/10
12/01/10
12/02/10
12/03/10
12/04/10
12/05/10

被接受的解决方案可以工作,但如果你想找到第二个工作日,你会遇到问题:

代码语言:javascript
运行
复制
echo strftime("%m/%d/%y", strtotime("December 2010 second Wednesday"));

打印:

代码语言:javascript
运行
复制
12/15/10

文档中给出了一些示例:

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

上述文档中的第二段说明解释了of如何影响日期计算过程:

还观察到,“序号空间”中的"of“和”最后一个空间“中的”of“做了一些特殊的事情。

  1. 它将每月的日期设置为1。
  2. “序号日期名”不会提前到另一天。(示例:"first tuesday of 2008“意思是”"2008-07-01").
  3. "ordinal dayname“确实提前到了另一天。(例如:"first tuesday 7月2008“表示"2008-07-08",另请参阅列表中的第4点above).
  4. "'last‘dayname ' of’”获取当月的最后一天名。(示例:"last wed of 2008 "2008-07-30")
  5. "'last‘“表示”last wed of 2008“表示当天的最后一天名。(示例:"last wed 2008年7月“表示"2008-06-25";”2008年7月“首先将当前日期设置为"2008-07-01”,然后"last wed“移动到前一个星期三,即"2008-06-25").
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4357490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档