我正在使用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
我已经google了,无法找到有关此特定PHP错误的任何资源。
我通过删除带有括号的文本来“解决”这个问题,该文本会返回相同的结果:
$dateString = strstr($dateString, " (", true); // Thu Nov 15 2012 00:00:00 GMT-0700
这似乎很糟糕,我正在寻找有关如何正确执行此操作的建议。
答案 0 :(得分:20)
使用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());
现在输出正确的日期:
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
(
)
)
格式末尾的+
是让它发挥作用的神奇之处。
答案 1 :(得分:4)
我会说这是一个错误。使用此字符串
时会出现相同的错误$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客户端,否则我会说剥离“时区”是一个可行的“解决方案”。
答案 2 :(得分:0)
我正在使用laravel 5.6在php 7.2中工作。多数支持者不起作用,因为在此php版本中找不到该方法。 (我不确定,但是给出了一个错误,提示找不到该方法)。 但是,有一种方法的行为与解决原始问题的方法完全相同(将javascript日期对象转换为时间戳)。
$fromDate = date_create_from_format('D M d Y H:i:s e+', $fromDate);
然后可以将其用于数据库查询或用作日期对象。