PHP Дата за временем меняется в Европе - PullRequest
0 голосов
/ 29 октября 2018

Этим утром я провел модульные тесты, и они не прошли Тесты принимали предложения за последние 48 часов, рассчитывая время с помощью:

date('U', time() - 48 * 3600)

Когда я использовал:

(new DateTime('-48 hours'))->format('U')

показала разницу в один час.

Может быть, причина в том, что в воскресенье в Польше время было перенесено на час назад

1 Ответ

0 голосов
/ 29 октября 2018

Я предполагаю, что ваш сервер работает с Europe/Warsaw в качестве часового пояса по умолчанию. PHP вычисления даты / времени часто некорректны, если они пересекают границы DST, как это имеет место здесь. Я предлагаю вам сделать все математику в UTC и при необходимости конвертировать из / в местное время.

Пожалуйста, сравните:

$warsaw = new DateTimeZone('Europe/Warsaw');
$utc = new DateTimeZone('UTC');

$start = new DateTime('2018-10-28 04:30:00', $warsaw);
$start->modify('-4 hours');
var_dump($start);

$start = new DateTime('2018-10-28 04:30:00', $warsaw);
$start->setTimezone($utc);
$start->modify('-4 hours');
$start->setTimezone($warsaw);
var_dump($start);
object(DateTime)#3 (3) {
  ["date"]=>
  string(26) "2018-10-28 00:30:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Warsaw"
}
object(DateTime)#4 (3) {
  ["date"]=>
  string(26) "2018-10-28 01:30:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Warsaw"
}

Версия вашего кода для Unix-метки не должна изменяться, поскольку временная метка Unix - это фиксированный момент времени (поэтому она не переключается с часовыми поясами).

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