Не удалось проанализировать строку времени в позиции 41 (i): спецификация двойного часового пояса
Я использую 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
Я googled вокруг и не могу найти какие-либо ресурсы на этой конкретной ошибке PHP.
Я "решаю" эту проблему, разделив текст в квадратных скобках, который возвращает те же результаты:
$dateString = strstr($dateString, " (", true); // Thu Nov 15 2012 00:00:00 GMT-0700
Это выглядит довольно плохо, и я ищу предложения о том, как это сделать правильно.
Ответы
Ответ 1
Используя 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
(
)
)
+
в конце формата - это магия, которая делает эту работу.
Ответ 2
Я бы сказал, что это ошибка. Вы получаете ту же ошибку при использовании этой строки
$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, я бы сказал, что разделение "часового пояса" является жизнеспособным "решением".