无法解析位置41(i)处的时间字符串:双时区规范

haf*_*huk 18 php jquery

我正在使用jquery daterangepicker,后者又使用jQuery datapicker.

我的Ubuntu系统工作正常.浏览器正在发送一个可解析的字符串:

$dateStarted = new \DateTime($post['startDate']); // Thu Nov 15 2012 00:00:00 GMT-0700 (MST)
print_r($dateStarted);
Run Code Online (Sandbox Code Playgroud)

输出:

DateTime Object
(
    [date] => 2012-11-15 00:00:00
    [timezone_type] => 1
    [timezone] => -07:00
)
Run Code Online (Sandbox Code Playgroud)

在我们的测试人员Windows系统上,浏览器在字符串中发送扩展的时区:

$dateStarted = new \DateTime($post['startDate']); // Thu Nov 15 2012 00:00:00 GMT-0700 (Mountain Standard Time)
print_r($dateStarted);
Run Code Online (Sandbox Code Playgroud)

抛出和异常:

Exception: DateTime::__construct(): Failed to parse time string 
 (Thu Nov 15 2012 00:00:00 GMT-0700 (Mountain Standard Time)) 
 at position 41 (i): Double timezone specification
Run Code Online (Sandbox Code Playgroud)

我已经google了,无法找到有关此特定PHP错误的任何资源.

我通过删除括号中的文本来"解决"这个问题,该文本返回相同的结果:

$dateString = strstr($dateString, " (", true); // Thu Nov 15 2012 00:00:00 GMT-0700
Run Code Online (Sandbox Code Playgroud)

这似乎很糟糕,我正在寻找有关如何正确执行此操作的建议.

haf*_*huk 21

使用DateTime :: createFromFormat()作为Marc B建议似乎是一个更好的解决方案.

我最终得到的是:

$dateStarted = \DateTime::createFromFormat('D M d Y H:i:s e+', $post['startDate']); // Thu Nov 15 2012 00:00:00 GMT-0700 (Mountain Standard Time)
print_r($dateStarted);
print_r(\DateTime::getLastErrors());
Run Code Online (Sandbox Code Playgroud)

现在输出正确的日期:

DateTime Object
(
    [date] => 2012-11-15 00:00:00
    [timezone_type] => 1
    [timezone] => -07:00
)

Array
(
    [warning_count] => 1
    [warnings] => Array
        (
            [33] => Trailing data
        )

    [error_count] => 0
    [errors] => Array
        (
        )

)
Run Code Online (Sandbox Code Playgroud)

+在格式到底是什么使得这个工作的魔力.


Ola*_*che 5

我会说这是一个错误。使用此字符串时,您将得到相同的错误

$dateStarted = new \DateTime("Thu Nov 15 2012 00:00:00 GMT-0700 (abcdefg)");
Run Code Online (Sandbox Code Playgroud)

少一个

$dateStarted = new \DateTime("Thu Nov 15 2012 00:00:00 GMT-0700 (abcdef)");
Run Code Online (Sandbox Code Playgroud)

并且被“正确地”解析。

似乎时区字符串限制为6个字符。除非您能够并且愿意配置Windows客户端,否则我说剥离“时区”是可行的“解决方案”。

  • 现在已经2018年了,问题依然存在。对于它的价值,您可以将日期字符串剪辑为长度 33。排除所有垃圾,并且像魅力一样工作。 (2认同)