2

我以前曾经DateTime::createFromFormat()将字符串解析为日期,但今天我发现了一个问题,我从这个调用中得到了 null。

echo $date_string;
$test = DateTime::createFromFormat('M d Y, H:i:s T', trim($date_string));
echo $test->format('Y-m-d H:i:s');

输出:

Oct 16 2013, 15:45:02 CEST

( ! ) Fatal error: Call to a member function format() on a non-object in (...) on line 51

第 51 行是我调用的最后一行format()

那么,我错过了什么吗?提前致谢!


DateTime::getLastErrors()按要求输出:

(
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 4
    [errors] => Array
        (
            [3] => Unexpected data found.
            [11] => Unexpected data found.
            [22] => Unexpected data found.
            [36] => The timezone could not be found in the database
        )

)

@whizzkid要求的捕获:

DateTime::__construct(): Failed to parse time string (Oct 16 2013, 10:00:00 CEST) at position 3 (&): Unexpected character
4

4 回答 4

3

您的字符串包含 UTF 不间断空格而不是普通空格。日期解析器不知道它们并且不会将它们视为空格。用正常的空格替换不间断的空格,例如:

$date_string = preg_replace('~\x{00a0}~u', ' ', $date_string);
于 2013-10-12T20:34:08.743 回答
2

你能试试这个:

<?php
//some $date_string exists
try {
    $test = new DateTime(trim(html_entity_decode($date_string)));
} catch (Exception $e) {
    echo $e->getMessage();
    exit(1);
}

echo $test->format('Y-m-d H:i:s');
?>

试试这个!......应该工作

于 2013-10-12T20:11:11.313 回答
2

我最近在我的 CI 项目中遇到了同样的问题。我用这种方法解决了它,它有效:

而不是这个:

$test = new DateTime($date_string);

或者

$date_string = preg_replace('~\x{00a0}~u', ' ', $date_string);

正如@Leo Nyx 所建议的,

我用这个解决了它:

$date = new DateTime(strtotime($date_string));

然后在它下面,随意格式化时间:

$date->format('d/m/Y');

当然,我已经尝试过这里发布的解决方案。pre_replace 方法有效,但我认为我在此处发布的方法可以为您节省一些 CPU。

这样做的主要原因是:不知何故,您的日期字符串包含一些 DateTime 方法不知道的字符!strtotime() 方法正确地将您的字符串转换为日期格式。

于 2015-12-30T10:43:29.773 回答
0

我发现了这个问题的另一个原因:

我的日期格式为 24 小时制(“H”)和上午/下午(“a”),这使解析器感到困惑。因此,我将日期格式从“Ymd H:ia T”更改为“Ymd h:ia T”(注意“h”),一切正常。

于 2014-10-27T05:42:45.997 回答