strtotime 结果没有意义,php 错误?
strtotime result makes no sense, php bug?
下面一行:
echo date('d', strtotime('First Saturday August 2015'));
打印出 08
,这似乎没有任何意义,因为一周中某一天的第一次出现不能在 7 号之后。
它是 php 错误还是 php 错误甚至是 php 错误?我不知道...
php版本:5.5.19
您需要 'of':
date('d/m/Y', strtotime('First Saturday of August 2015'))
查看手册:
http://docs.php.net/manual/en/datetime.formats.relative.php
更新 #1: 下面解释了像 "of
" 这样的简单词所带来的巨大差异,在我之后在 PHP 源代码中进行了一些调查。
更新 #2: 实际上 是 PHP 手册上的文档页面,解释了 the formats strftime()
接受的日期。直到现在我才意识到这一点。感谢@Outspaced 在他们的回答中提供 link。
为了快速轻松地阅读,请跳过 更新 #1。
初始答案:
的确如此,
echo date('Y-m-d', strtotime('First Saturday August 2015'));
打印:
2015-08-08
但是
echo date('Y-m-d', strtotime('First Saturday of August 2015'));
打印正确的日期:
2015-08-01
既然strtotime()
试图“听懂”英语,我猜你和它说的是不同的方言:-)
更新 #1:
在阅读 PHP source code of function strtotime()
之后,我认为它将 First Saturday August 2015
解析为 First Saturday
,然后是 August 2015
。
August 2015
是一个绝对表达式,因为有 no indication about the day it produces 2015-08-01
(2015 年 8 月的第 1st)这是一个合理的猜测(唯一的我认为有可能)。
First Saturday
是一个 relative expression. It is relative to an absolute mark provided in the string (August 2015
) or as a second parameter of strtotime()
and it "shifts" 绝对标记后退或前进一定数量的时间戳。
将它们放在一起,strtotime()
将 First Saturday August 2015
解释为 First Saturday
从 August 1, 2015
开始计数,也就是说,确实 August 8, 2015
.
另一方面,First Saturday of August 2015
使用 different rule 进行解析。 next
、last
、previous
、this
之一或从 first
到 twelfth
的任何序数,后跟工作日名称(完整或缩写)后跟 of
被解析为所提供月份的工作日(如果字符串中提供了 none,则解析为当前月份)。
更新 #2
经过我发现strtotime()
接受的字符串格式是其实是explained in the PHP documentation, the explanation became more simple. Take a look at the second "Note:" box in the documentation page.
First Saturday August 2015
在注释的第 4 项中有解释:
"ordinal dayname" does advance to another day.
First Saturday of August 2015
在注释的第 6 项中有解释:
"ordinal dayname 'of'" does not advance to another day.
该注释以一整块专门用于 神奇 单词“of
”的解释结束。
如上所述,PHP 不太理解您选择的方言。如果您计划接受来自用户的各种输入(这不是一个坏主意)来表达日期,我建议您自己对该用户输入进行一些规范化,以便您可以向 strtotime 提交可预测的格式。
下面一行:
echo date('d', strtotime('First Saturday August 2015'));
打印出 08
,这似乎没有任何意义,因为一周中某一天的第一次出现不能在 7 号之后。
它是 php 错误还是 php 错误甚至是 php 错误?我不知道...
php版本:5.5.19
您需要 'of':
date('d/m/Y', strtotime('First Saturday of August 2015'))
查看手册: http://docs.php.net/manual/en/datetime.formats.relative.php
更新 #1: 下面解释了像 "of
" 这样的简单词所带来的巨大差异,在我之后在 PHP 源代码中进行了一些调查。
更新 #2: 实际上 是 PHP 手册上的文档页面,解释了 the formats strftime()
接受的日期。直到现在我才意识到这一点。感谢@Outspaced 在他们的回答中提供 link。
为了快速轻松地阅读,请跳过 更新 #1。
初始答案:
的确如此,
echo date('Y-m-d', strtotime('First Saturday August 2015'));
打印:
2015-08-08
但是
echo date('Y-m-d', strtotime('First Saturday of August 2015'));
打印正确的日期:
2015-08-01
既然strtotime()
试图“听懂”英语,我猜你和它说的是不同的方言:-)
更新 #1:
在阅读 PHP source code of function strtotime()
之后,我认为它将 First Saturday August 2015
解析为 First Saturday
,然后是 August 2015
。
August 2015
是一个绝对表达式,因为有 no indication about the day it produces 2015-08-01
(2015 年 8 月的第 1st)这是一个合理的猜测(唯一的我认为有可能)。
First Saturday
是一个 relative expression. It is relative to an absolute mark provided in the string (August 2015
) or as a second parameter of strtotime()
and it "shifts" 绝对标记后退或前进一定数量的时间戳。
将它们放在一起,strtotime()
将 First Saturday August 2015
解释为 First Saturday
从 August 1, 2015
开始计数,也就是说,确实 August 8, 2015
.
另一方面,First Saturday of August 2015
使用 different rule 进行解析。 next
、last
、previous
、this
之一或从 first
到 twelfth
的任何序数,后跟工作日名称(完整或缩写)后跟 of
被解析为所提供月份的工作日(如果字符串中提供了 none,则解析为当前月份)。
更新 #2
经过我发现strtotime()
接受的字符串格式是其实是explained in the PHP documentation, the explanation became more simple. Take a look at the second "Note:" box in the documentation page.
First Saturday August 2015
在注释的第 4 项中有解释:
"ordinal dayname" does advance to another day.
First Saturday of August 2015
在注释的第 6 项中有解释:
"ordinal dayname 'of'" does not advance to another day.
该注释以一整块专门用于 神奇 单词“of
”的解释结束。
如上所述,PHP 不太理解您选择的方言。如果您计划接受来自用户的各种输入(这不是一个坏主意)来表达日期,我建议您自己对该用户输入进行一些规范化,以便您可以向 strtotime 提交可预测的格式。