Я использую 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
Это выглядит довольно плохо, и я ищу предложения о том, как это сделать правильно.
Использование 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, я бы сказал, что разделение «часового пояса» является жизнеспособным «решением».