2014-12-12 2 views
2

У меня есть строка даты/времени, соответствующая ISO 8601 2014-12-11T23:43:44+00:00, которую я передаю через HTTP на веб-сервер. Там я извлекаю данные из поля HTTP POST, и все отлично, когда у меня print_r мои параметры, значение возвращается как 2014-12-11T23:43:44 00:00.Ошибка, когда дата и время ISO 8601 отправлены по HTTP и созданы в PHP. Объект DateTime

Что я заметил, так это то, что в настоящее время отсутствует +, (я предполагаю, что это в представлении данных, а не в том, что данные закодированы как и не является (?) Проблемой, не так ли?)

Затем на разбор значения в качестве параметра, чтобы создать новый объект DateTime, я получаю следующее сообщение об ошибке:

DateTime::__construct(): Failed to parse time string (2014-12-11T23:43:44 00:00) at position 20 (0): Double time specification 

Я предполагаю, что это потому, что он видит, как 00:00, добавить свою еще раз после 23:43:44, когда, разумеется, это разница во времени.

Это потому, что отсутствует + или я делаю что-то еще неправильно?

Я также должен указать, что мое первоначальное значение (2014-12-11T23:43:44+00:00) исходит из поля http://www.timestampgenerator.com ISO 8601.

Edit:

Вот код, я использую, чтобы получить строку из запроса POST в PHP:

static function request_parameters($including_request_uri = false) 
{ 
    $request_parameters = $_REQUEST; 

    if (!$including_request_uri) 
    { 
     unset($request_parameters[PARAMETER_NAME_REQUEST]); 
    } 

    return $request_parameters; 
} 

Тогда я получить значение, как это:

$parameters =  RESTController::request_parameters(); 
$date_created =  $parameters[UNIVERSALLY_UNIQUE_OBJECT_KEY_DATE_CREATED]; 
+1

Вы уверены, что это POST? '+' - это одна из форм представления пространства в URL-адресе, поэтому это было бы легко объяснить, если бы мы говорили о GET. – Jon

+2

. '+' в URL-адресе является закодированным символом пробела. Строка даты запускается через url_decode() где-то, а символ '+' декодируется в пробел. Если вы хотите передать эту '+' через строку запроса, она будет закодирована в '% 2B' –

+0

попробуйте с $ date = preg_replace ("// "," + ", $ date); – BredeBS

ответ

0

Вы всегда можете попробовать сделать trim(' ', str_replace(' ','+',$datetime)); для проверки. Это приведет к разрыву пробелов снаружи и превращению вашего внутреннего пространства в соответствие со стандартом ISO8901.

Я считаю, что ваш POST, входящий, интерпретируется как закодированное пространство. Другой способ сделать это (если у вас есть контроль над все, что отправка) POST с:

$datetime = urlencode($datetime); 

Тогда на приемном конце:

$datetime = urldecode($_POST['datetime']); 
+0

Это похоже на работу, но я не могу не чувствовать, что это быстрое исправление/обходное решение. Правильно ли это решить эту проблему? –

+0

Это работа вокруг, у вас есть контроль над тем, что публикует это? Если это так, я бы настоятельно рекомендовал urlencoding (например, выше) перед отправкой, это было бы реальным исправлением, а не патчем, поскольку вы ускользаете, а не обходя стороной. ;) – ehime

+1

Да, у меня есть контроль на обоих концах. Спасибо за ответ –

 Смежные вопросы

  • Нет связанных вопросов^_^