Обеспечение времени Unix в PHP - PullRequest
0 голосов
/ 16 декабря 2018

В моем коде предполагается, что ноль представляет начало эпохи Unix, 1970-01-01 00:00.Я обновил установку PHP, и теперь, внезапно, ноль представляет 1970-01-01 01:00 (как проверено с date('Y-m-d H:i', 0)).Так что, по-видимому, существует вопрос часового поясаЯ положил тот же код в песочницу и получил 1969-12-31 16:00.У меня есть несколько модульных тестов, которые сломаны в результате этого.Часовые пояса здесь не должны и не должны вступать в игру.

Как я могу гарантировать, что функции даты и времени, такие как date(), всегда преобразуют ноль в 1970-01-01 00:00 независимо от настройки часового поясана конкретную установку?

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

Вам нужно установить часовой пояс по умолчанию на GMT, если вы хотите использовать date() как этот.Например:

date_default_timezone_set('GMT');
echo date('Y-m-d H:i [I] [e] [O]',0);

Выше будет показано (независимо от того, какой сервер был установлен):

1970-01-01 00:00 [0] [GMT] [+0000]

Без date_default_timezone_set('GMT') или даже с Europe/London, вы получите другой результат в разное время года.

Из руководства по PHP;

0 голосов
/ 16 декабря 2018

Решение состоит в том, чтобы получить настройку часового пояса, отложить ее, изменить часовой пояс на UTC, выполнить вычисления и сбросить часовой пояс до его первоначального значения.

Так что, если моя исходная функция выглядела следующим образом:

public function format($argument = null)
{
  // Perform some calculations involving date() and strtotime().
  return $result;
}

Теперь это выглядит так:

public function format($argument = null)
{
  $timezone = date_default_timezone_get();
  date_default_timezone_set('UTC');
  $result = ...; // Perform some calculations involving date() and strtotime().
  date_default_timezone_set($timezone);
  return $result;
}
0 голосов
/ 16 декабря 2018

Используя gmdate () , вы всегда получите 1970-01-01 00:00 для 0, независимо от того, в каком часовом поясе находится ваш сервер:

<?php
date_default_timezone_set('Europe/Berlin');

echo "Europe/Berlin:\n";
echo "gmdate: ".gmdate('d.m.y H:i', 0) . "\n";
echo "date: ".date('d.m.y H:i', 0) . "\n";

date_default_timezone_set('America/Los_Angeles');

echo "\nAmerica/Los_Angeles:\n";
echo "gmdate: ".gmdate('d.m.y H:i', 0) . "\n";
echo "date: ".date('d.m.y H:i', 0) . "\n";

/* OUTPUT:
Europe/Berlin:
gmdate: 01.01.70 00:00
date: 01.01.70 01:00

America/Los_Angeles:
gmdate: 01.01.70 00:00
date: 31.12.69 16:00
*/

https://3v4l.org/FechC

...