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