PHP $ _GET Параметр, содержащий символ + - PullRequest
0 голосов
/ 08 февраля 2020

Я обрабатываю запрос GET, и один из параметров выглядит следующим образом:

statusDatetime=2017-09-01T10:00:05+00:00

Я получаю это с помощью:

$timestamp = $_GET['statusDatetime'];
echo $timestamp;

, который возвращает 2017-09-01T10:00:05 00:00, т.е. он заменяет символ +, который был после смещения часового пояса 05, пробелом. Затем это исключает мои попытки преобразовать это в другой формат, подобный этому:

$date = DateTime::createFromFormat('Y-m-d\TH:i:s T', $timestamp);
$date->setTimeZone(new DateTimeZone("Australia/Sydney"));
$newTimestamp = $date->format('m/d/Y h:i:s A');

, который генерирует ошибку 500:

PHP Fatal error:  Uncaught Error: Call to a member function setTimeZone() on boolean

для этой строки:

$date->setTimeZone(new DateTimeZone("Australia/Sydney"));

Я могу просто изменить пробел обратно на символ +, поскольку смещение часового пояса может быть отрицательным и т. Д. c, поэтому ищите решение, которое сохранит параметр statusDatetime в том виде, в котором он был отправлен.

1 Ответ

0 голосов
/ 08 февраля 2020

Я запустил следующий код в качестве теста:

<?php
$timestamp = "2017-09-01T10:00:05+00:00";
$date = DateTime::createFromFormat('Y-m-d\TH:i:s T', $timestamp);
$date->setTimeZone(new DateTimeZone("Australia/Sydney"));
$newTimestamp = $date->format('m/d/Y h:i:s A');
echo "<div style='font-family: monospace;'>\r\n";
var_dump($timestamp, $date, $newTimestamp);
echo "</div>\r\n";
?>

Работал, как и ожидалось, без ошибок. Вывод:

string(25) "2017-09-01T10:00:05+00:00" 
object(DateTime)#1 (3) { 
  ["date"]=> string(26) "2017-09-01 20:00:05.000000" 
  ["timezone_type"]=> int(3) 
  ["timezone"]=> string(16) "Australia/Sydney"
}
string(22) "09/01/2017 08:00:05 PM" 

Я бы подтвердил, что вы получаете правильные данные в результате вашего GET.

ОБНОВЛЕНИЕ

Ваша строка закодирован Вы ожидали, что строка будет:

2017-09-01T10:00:05+00:00

Это не так, поскольку браузер кодирует много потенциально опасных символов, на самом деле:

2017-09-01T10%3A00%3A05%2B00%3A00

Попробуйте это:

$timestamp = urldecode($_GET['statusDatetime']);

Я проверял это:

<?php
$timestamp = urldecode("2017-09-01T10%3A00%3A05%2B00%3A00");
$date = DateTime::createFromFormat('Y-m-d\TH:i:s T', $timestamp);
$date->setTimeZone(new DateTimeZone("Australia/Sydney"));
$newTimestamp = $date->format('m/d/Y h:i:s A');
echo "<div style='font-family: monospace;'>\r\n";
var_dump($timestamp, $date, $newTimestamp);
echo "</div>\r\n";
?>

Сценарий выполнен правильно. Подробнее: HTML Ссылка на кодировку URL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...