【问题标题】:strtotime on incorrect datesstrtotime 在不正确的日期
【发布时间】:2017-06-05 06:22:55
【问题描述】:

我发现 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 月初返回呢?
它是否意味着功能,如果你犯了错误,它会“纠正你”?或者它是 strtotime() 中的一个真正的错误?

【问题讨论】:

  • 月 'JUNE' 只有 30 天。所以如果你写 31 PHP 日期函数会自动将其转换为下一个日期。
  • 所以它是一个功能?我在手册中找不到任何关于它的内容。
  • 值 31 是 strtotime 可接受的值,32 不是
  • 为什么会这样?因为这就是他们选择实施修复的方式。如果您阅读 php.net 上的条目,这是一个非常松散的功能。另请参阅他们如何使用“+1 个月”处理 1 月 30 日和 31 日
  • @DaveS 不确定我找到了你提到的正确的那个。你能链接到它吗?发帖人的名字是一个链接

标签: php strtotime


【解决方案1】:

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

时间
日期/时间字符串。有效格式在Date and Time Formats 中进行了解释。

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

因此对于日期格式(即DD),01-31 是有效的(因为 3 后面只能跟 01) 与月份无关。根据提供的月份和日期值,日期将被调整。

也可以在同一页的注释中找到:

注意
ddDD 格式有可能上溢和下溢。第 0 天表示上个月的最后一天,而溢出计入下个月。这使得“2008-08-00”等价于“2008-07-31”和“2008-06-31”等价于“2008-07-01”(六月只有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


1http://php.net/manual/en/datetime.formats.date.php

2http://php.net/manual/en/datetime.formats.date.php#Hcom117014

【讨论】:

  • 哈!我从未点击过有关有效日期的链接。没想到那里有什么可读的。我希望主页上有足够的信息来弄清楚。谢谢。
【解决方案2】:

因为一个月的一天31 是可能的,strtotime() 将为您更正日期。如果您在 2 月 (2017-02-31) 尝试它,它将更正为 2017-03-03。这是你找到的。

所以,它的本质是:

  1. 获取日期
  2. 检查日期是否在有效范围内(每天的天数) 月)
  3. 如果无效,则计算下个月的天数

此行为在strtotime 函数本身中实现。

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

【讨论】:

  • 谢谢!奇怪的是,手册本身中关于此的信息如此之少。您必须阅读有关“+1 月”之类的 cmets 才能找到它。
  • 确实,@SamOnela 有一个引文(来自关于日期的文档)来解释它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
相关资源
最近更新 更多