使用 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 号)。
有人对此有解释吗?
I'm trying to figure out the first wednesday of a given month using strtotime
, but the "first wednesday" argument fails whenever the first wednesday happens to fall on the 1st.
For a more general illustration of this problem, see the following code and result:
$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>";
Results in:
12/06/10
12/07/10
12/08/10
12/02/10
12/03/10
12/04/10
12/05/10
Notice something? Shouldn't one day of the week coincide with the 1st of the month? But it never does, and instead the second instance of the day, on the 8th, is always returned.
Anyone have an explanation for this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
根据所提供的答案,需要了解 php 5.2 和 php 5.3 之间相对日期格式的差异。
测试:
5.2 结果:
5.3 结果:
因此,只有第三种方法在 PHP 5 版本中返回正确的结果。
Building off the answers provided, one needs to be aware of differences in relative date formatting between php 5.2 and php 5.3.
TEST:
5.2 Results:
5.3 Results:
Therefore only the third method returns correct results across PHP 5 versions.
我没有任何解释,因为我也很眼花缭乱,但我设法找出如何通过省略“第一个”来获得正确的日期,如下所示:
I don't have any explanation as I'm also dazzled, but I managed to find out how you get the correct date by omitting the "first", like so:
只是你的格式不正确。您需要包含
of
:打印:
接受的解决方案有效,但如果您想查找第二个工作日,您会遇到问题:
打印:
文档中给出了一些示例:
http://www.php.net/manual/en/datetime.formats.relative.php< /a>
上述文档中的第二块注释解释了
of
如何影响日期计算过程:It's just your formatting that is incorrect. You need to include
of
:Prints:
The accepted solution works, but you would encounter problems if you wanted to find the second weekday:
Prints:
There are some examples given in the docs:
http://www.php.net/manual/en/datetime.formats.relative.php
The second block of notes in the above documentation explains how
of
affects the date calculation process:我在 PHP 手册中找到了这个注释。
“在 5.2.7 之前的 PHP 5 中,请求某个月份中某个给定工作日的给定出现(该工作日是该月的第一天)会错误地在返回的时间戳中添加一周。这一问题已在 5.2.7 和以后的版本。”
I found this note in the PHP manual.
"In PHP 5 prior to 5.2.7, requesting a given occurrence of a given weekday in a month where that weekday was the first day of the month would incorrectly add one week to the returned timestamp. This has been corrected in 5.2.7 and later versions."
PHP 5.5.11
$firstWeekdayOfMonth = new DateTime('first weekday 0 jun 2016');
我不知道为什么,但是零类型强制 strtotime 解析器在月初启动考虑到第一天。
PHP 5.5.11
$firstWeekdayOfMonth = new DateTime('first weekday 0 jun 2016');
I don't know why, but the zero kind of force the strtotime parser to start at the beginning of the month considering the first day.
我相信这是您放置值的顺序。
当您写“2010 年 12 月”时,已经到了 12/01/2010。当添加“首先
{day}”,函数适用于 2010 年 12 月 1 日之后的第一天。我认为,如果您声明“第一个 {day}”值,然后声明“2010 年 12 月”,它应该可以正常工作。
I believe it's the order in which you are placing values.
When you write "December 2010", it already is going to 12/01/2010. When adding "first
{day}", function goes for that very first day, after the 12/01/2010. I think if you declare the "first {day}" value and then "december 2010" it should work fine.