PHP日期函数返回错误的月份和日期

时间:2017-07-05 06:05:46

标签: php date strtotime

我已经在PHP开发工作了5年,但之前从未见过这种类型的错误。

我的日期是该月的最后一天,我将使用以下代码更改其格式:

$data['toDate'] = "2017-04-31";
echo $data['toDate']." : ".date('d-m-Y',strtotime($data['toDate']))." ### ";
die;

输出:

  

2017-04-31 00:00:00:01-05-2017 ###

我正在使用PHP 5.6.25版。 有没有人可以帮助我?

4 个答案:

答案 0 :(得分:2)

4月31日不存在。因为PHP将在4月30日之后的那天发生。

答案 1 :(得分:1)

四月只有30天,所以它实际上正在纠正您使用的日期。第31届真的是5月1日。

答案 2 :(得分:0)

输入错误,而不是date()

$data['toDate'] = "2017-04-31";// no 31st in 4th(April) month
echo $data['toDate'] ." : ". date('d-m-Y',strtotime($data['toDate']))." ### ";
die;

它只显示下一个日期01-05-2017

答案 3 :(得分:0)

TL;博士

04-31有效但技术上不是April中的日期,因为April只有30天,因此strtotime()会产生05-01。

文档

如果您查看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

因此 04-31 有效但溢出。

此外,在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