我发现strtotime()有点奇怪。
在不存在的日期,它返回第二天。
$d30= strtotime("2017-06-30");
Echo $d30 ."\n";
Echo date("Y-m-d", $d30)."\n\n"; // 2017-06-30
$d31= strtotime("2017-06-31");
Echo $d31 ."\n";
Echo date("Y-m-d", $d31)."\n\n"; // 2017-07-01
$d32= strtotime("2017-06-32");
Echo $d32 ."\n";
Echo date("Y-m-d", $d32); // 1970-01-01
我理解最后一个。它没有返回任何内容,因为它是一个错误 但为什么第二个会在7月1日之前回归? 它是否意味着功能性,如果你犯了错误,它将会纠正你"?或者它是strtotime()中的真正错误?
答案 0 :(得分:6)
如果您查看strtotime()的文档,您会看到第一个参数是:
<强>时间强>
中说明
日期/时间字符串。有效格式在Date and Time Formats。
如果您点击日期和时间格式的链接并转到Date Formats,您会看到:
因此,对于日期格式(即 DD ),01-31有效(因为 3 后面只能跟一个 0 或 1 )尽管有一个月。根据提供的月份和日期值,将调整日期。
也可以在同一页的注释中找到:
注意强>:
可以对 dd 和 DD 格式进行上下颠倒。第0天表示上个月的最后一天,而溢出计入下个月。这使得&#34; 2008-08-00&#34;相当于&#34; 2008-07-31&#34;和&#34; 2008-06-31&#34;相当于&#34; 2008-07-01&#34; (六月只有30天)。 1
因此 06-31 有效,而 06-32 无效。
此外,在User Contributed Notes部分,note by Mirek at 2015-04-01 01:14可能有用/有趣:
注意:首先检查日期(dd或DD)的范围0..31,并且只有在适合的情况下,才可以应用上溢和下溢机制。如果没有,strtotime()只返回false。 如果您需要无限制的上/下限进行日期计算(例如2015-01-40至2015-02-09),请改用mktime()。 2
1 <子> http://php.net/manual/en/datetime.formats.date.php 子>
2 <子> http://php.net/manual/en/datetime.formats.date.php#Hcom117014 子>
答案 1 :(得分:3)
可能会在一个月天
31
更正您的日期。如果您使用二月(2017-02-31)进行试用,它将更正为strtotime()
。这就是你找到的。
所以,它本质上的作用是:
此行为已在2017-03-03
函数本身中实现。
关于此问题的文档页面有一个很好的评论,但我无法再找到它。这个comment提供了一些额外的信息(请务必查看评论中的链接)。