Не удалось проанализировать строку времени в позиции 41 (i): спецификация двойного часового пояса

Я использую jquery daterangepicker , который, в свою очередь, использует datapicker jQuery.

Моя система 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 

Это выглядит довольно плохо, и я ищу предложения о том, как это сделать правильно.

Solutions Collecting From Web of "Не удалось проанализировать строку времени в позиции 41 (i): спецификация двойного часового пояса"

Использование DateTime :: createFromFormat (), поскольку предлагаемый Marc B, похоже, является лучшим решением.

То, что у меня получилось:

 $dateStarted = \DateTime::createFromFormat('DM d YH: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 ( ) ) 

+ В конце формата – это волшебство, которое делает эту работу.

Я бы сказал, что это ошибка. Вы получаете ту же ошибку при использовании этой строки

 $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, я бы сказал, что разделение «часового пояса» является жизнеспособным «решением».