为什么strtotime()和date()返回1969-31-12?

时间:2014-03-07 21:15:10

标签: php date strtotime

我有这段代码:

$endDate='02-20-2014'; //Just updated this
echo date('Y-d-m',strtotime($endDate));

为什么strtotime()不断给我1969-31-12

我的目标是获得:2014-02-20

2 个答案:

答案 0 :(得分:0)

根本问题

PHP supported date formats不包括您使用的输入日期格式,'02-20-2014'mm-DD-YY

为什么要获得1969-31-12

由于输入格式错误,strtotime()失败。在PHP 5.1及更高版本中,strtotime()在这种情况下会返回falsedate()调用将评估为1970-01-01(即the day of the UNIX epoch)。

但是,在您的情况下,strtotime()似乎会在失败时返回-1。这表明您使用的是过时的PHP版本(5.0.x or less)。它还会导致date()调用返回1969-31-12(即减去the UNIX epoch的一秒钟)

解决方案

将输入日期格式更改为PHP supported date formats中的任何一种。此外,为了获得您指明的输出日期格式2014-02-20YY-mm-dd,您应该根据{{1}调整format函数的date()参数转到Y-d-m

例如:

Y-m-d

关于PHP版本的附注

如果可能,强烈建议您将系统从过时的PHP 5.0.x版本迁移到最新版本。您应该小心检查the change logs of each version migration ever since以确保不会破坏任何现有代码。

答案 1 :(得分:0)

刚发现这一点,并认为我应该添加一个更正和其他信息:

  

m / d / y或d-m-y格式的日期通过查看来消除歧义   各个组件之间的分隔符:如果分隔符是   斜线(/),则假定为美国m / d / y;而如果   分隔符是破折号(-)或点(。),然后是欧洲d-m-y格式   假设。 (资源:   Converting string to Date and DateTime

如果使用strtotime,则2014年2月20日!= 2014年2月20日

2014年2月20日将失败,因为没有20个月了

2014年2月20日是2月20日

如果您使用如上所述的一年优先格式,例如

$endDate='2014-20-02';

然后中间的数字对总是 一个月,因此无论您的日期是美国还是欧洲,此日期都是无效的。

echo date('Y-m-d',strtotime($endDate));

echo date('Y-d-m',strtotime($endDate));

都会失败,因为传递给date的第一个参数是输出格式,并且strtotime已经失败,导致返回的日期为“ 1969-12-31”