使用具有strtotime功能的日期功能时格式化日期出现问题

时间:2009-07-22 14:28:40

标签: php

我正在使用日期函数和strtotime函数来格式化日期。

前:

<?php
$input_date = '03-JUL-09 14:53';

$formatted_date =  date("Y-m-d H:i:s", strtotime($input_date));

echo $formatted_date;
?>

给我一​​个预期的输出: 2009-07-03 14:53:00

如果输入更改为(我正在删除分钟部分) -

<?php
$input_date = '03-JUL-09 14';

$formatted_date =  date("Y-m-d H:i:s", strtotime($input_date));

echo $formatted_date;
?>

这里的输出是 1970-01-01 05:30:00 ,这完全没有预期。

我正在做的错误以及如何修复它。

由于

阿米特

6 个答案:

答案 0 :(得分:2)

1970-01-01 05:30:00 是印度在Unix时代的时间( 1970-01-01 00:00:00 GMT / UTC )。这意味着strtotime返回了0false0已被date转换为{{1}}。这是因为它无法处理其输入,正如其他人所解释的那样。

答案 1 :(得分:2)

函数strtotime希望给出一个包含美国英语日期格式的字符串,并尝试将该格式解析为Unix时间戳。 您可以使用

之类的字符串
  • 2009年7月3日
  • 现在
  • 03年9月7日
  • 09-07-03 14:00:00
  • +1周2天4小时2秒
  • 上周一

但不完整的日期格式如“09-07-03 14”。解析器不理解它并且不返回任何内容,因此当您调用date("Y-m-d H:i:s", strtotime($input_date));时它返回0时间戳(1970年1月1日00:00:00 UTC),因为它是默认值。

你必须提供一个可以解析的正确字符串。

答案 2 :(得分:1)

这看起来归结为strtotime()无法确定哪个数字是第二个日期字符串中的数字。

我最好的建议是在将日期时间值传递给strtotime()之前将其标准化。像这样简单的东西就足够了

if ( false === strpos( $input_date, ':' ) )
{
  $input_date .= ':00';
}

答案 3 :(得分:1)

03-JUL-09 14似乎不是有效的日期字符串,03-JUL-09 14:00工作正常

来自php手册:strtotime - 将关于任何英文文本日期时间描述解析为Unix时间戳

答案 4 :(得分:0)

1970-01-01是典型的基准日期(例如ctime)。我相信输出会将0的值格式化为日期,即1970,以及一天中无关的05:30:00时间。

我认为在尝试格式化不包含所有请求的时间元素的日期时,这是一个侥幸。您可以填充日期数据以生成完整的输入日期吗?

答案 5 :(得分:0)

删除分钟部分时,

strtotime()无法解析第二个字符串。它不知道额外的“14”意味着什么,所以它返回bool(false)。调用date(false)返回与date(0)相同的内容,即它为您提供UNIX纪元的日期:1970年1月1日00:00:00 GMT根据您当地时区调整。