23

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

我的 Ubuntu 系统运行良好。浏览器正在发送一个可解析的字符串:

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

输出:

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

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

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

抛出和异常:

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

我四处搜索,找不到有关此特定 PHP 错误的任何资源。

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

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

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

4

3 回答 3

28

正如 Marc B 所建议的那样使用DateTime::createFromFormat()似乎是一个更好的解决方案。

我最终得到的是:

$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());

现在输出正确的日期:

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
        (
        )

)

+格式末尾的 是使这项工作发挥作用的魔力。

于 2012-11-16T20:55:57.710 回答
6

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

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

少一个

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

它被“正确”解析。

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

于 2012-11-16T18:13:28.383 回答
0

我正在使用 laravel 5.6 在 php 7.2 中工作。大多数upvoted unswer 不起作用,因为在此php 版本中找不到该方法。(我不确定,但它给出了一个错误,说找不到该方法)。但相反,有一种方法与解决原始问题的方法完全相同(将 javascript 日期对象转换为时间戳)。

$fromDate = date_create_from_format('D M d Y H:i:s e+', $fromDate);

然后可以将其用于数据库查询或用作日期对象。

于 2020-01-22T09:42:32.800 回答