Преобразование времени в PHP и часовые пояса - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь преобразовать дату RSS (ISO 8601) в дату iCalendar. Я подумал, что смогу превратить начальную дату в метку времени Unix, а затем отформатировать ее с strftime.

. Я понимаю, что strftime меняет дату на местное время.

Яполучение начального значения $date из RSS-канала Wordpress, настроенного для часового пояса Европы / Цюриха. Дата, полученная из RSS, является правильной (начиная с 15 ноября в 8:00).

Когда я конвертирую ее, она получает дополнительный час.

Мне пришлось установить date_default_timezone_set('UTC'), чтобыоставьте время без изменений.

$tz = "Europe/Zurich";
//date_default_timezone_set('UTC'); //not Europe/Zurich
$date = "2019-11-15T08:00:00+00:00";
$dt = strftime("%Y%m%dT%H%M%S", strtotime($date));

echo $date . "\r\n";
echo strtotime($date) . "\r\n";
echo $dt . "\r\n";
  • 2019-11-15T08: 00: 00 + 00: 00
  • 20191115T090000

Я запуталсяработа с часовыми поясами ... Исходное значение в Цюрихе - 8:00, но при переносе на дату iCalendar, даже если часовой пояс тот же, добавляется один час.

Что является лучшим способом обработкиэто?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Попробуйте использовать более современный класс DateTime при работе с датами:

$date = "2019-11-15T08:00:00+00:00";
$dtobj = new \DateTime($date);

var_dump($dtobj);
echo date_default_timezone_get();
echo "\n";
echo $dtobj->format("Ymd\This");

В моей системе это приводит к:

class DateTime#1 (3) {
  public $date =>
  string(26) "2019-11-15 08:00:00.000000"
  public $timezone_type =>
  int(1)
  public $timezone =>
  string(6) "+00:00"
}
America/Toronto
20191115T080000

Как видите, объектсохраняет часовой пояс как свойство, поэтому часовой пояс в системе больше не актуален.

0 голосов
/ 08 ноября 2019
  • Переменная $tz не имеет значения, поскольку абсолютно ничего не делает для преобразования.
  • strtotime берет часовой пояс либо из самой строки, если она содержит информацию о часовом поясе, либо из date_default_timezone_setесли строка не содержит информации о часовом поясе. Ваша строка содержит информацию о часовом поясе.
  • strftime использует часовой пояс, установленный в системной переменной TZ . То есть не $tz, он установлен вашей операционной системой "вне" PHP.

Итак, строка анализируется как метка времени UTC, поскольку она содержит +00:00часовой пояс, а затем преобразуется в любой ваш локальный TZ.

Если вам нужна функция форматирования даты в PHP, которая подчиняется date_default_timezone_set вместо более неясных TZ, это будет date.

...