strtotime日期不正确

时间:2017-06-05 06:22:55

标签: php strtotime

我发现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

https://3v4l.org/AjMAE

我理解最后一个。它没有返回任何内容,因为它是一个错误 但为什么第二个会在7月1日之前回归? 它是否意味着功能性,如果你犯了错误,它将会纠正你"?或者它是strtotime()中的真正错误?

2 个答案:

答案 0 :(得分:6)

如果您查看strtotime()的文档,您会看到第一个参数是:

  

<强>时间
  日期/时间字符串。有效格式在Date and Time Formats

中说明

如果您点击日期和时间格式的链接并转到Date Formats,您会看到:

enter image description here

因此,对于日期格式(即 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()。这就是你找到的。

所以,它本质上的作用是:

  1. 获取日期
  2. 检查日期是否在有效范围内(每天的天数) 月)
  3. 如果没有有效的计数天数到下个月
  4. 此行为已在2017-03-03函数本身中实现。

    关于此问题的文档页面有一个很好的评论,但我无法再找到它。这个comment提供了一些额外的信息(请务必查看评论中的链接)。