преобразование strtotime в неправильный часовой пояс - PullRequest
0 голосов
/ 16 января 2019

При преобразовании значения даты с помощью strtotime () я столкнулся со следующей проблемой.Если я сделаю: strtotime('1/1/2019') вывод будет 1546293600 -> 31.12.2018 @ 10:00pm (UTC)

  • Если я сделаю: date_default_timezone_get() вывод Europe/Bucharest
  • В моем файле php.ini (измоя учетная запись хостинга), часовой пояс установлен на date.timezone="Europe/Helsinki"

У меня следующие два вопроса.

  1. Не должен date_default_timezone_get() выводить то, что настроено в моемхостинг аккаунтов php.ini файл?(date_default_timezone_set() не используется)?
  2. Почему результат преобразования strtotime() находится в часовом поясе GMT-2?Насколько я понимаю, если нет поставленной метки времени, преобразование должно быть выполнено по текущему времени (которое должно быть GMT + 2, Хельсинки или Бухарест)?

Если я делаю date_default_timezone_set('UTC')результат преобразования strtotime('1/1/2019) выполнен правильно (по Гринвичу + 2).

Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Укажите час и часовой пояс для функции, используя полный формат IS0 8601 2019-01-01T12:00:00+00:00. Таким образом, вы получите правильную метку времени в UTC. Если вы не используете час, я рекомендую использовать 12 часов утра.

В следующем примере я буду использовать числовой массив дат для построения этой строки

//   [Y,m,d]
$date = [2019,1,1];
for($i=1; $i<3; $i++){
  $date[$i] = str_pad($date[$i],2,'0',STR_PAD_LEFT);
}
$t1 = strtotime(implode('-',$date).'T12:00:00+00:00');
echo date('r',$t1);
//=>Tue, 01 Jan 2019 12:00:00 +0000
0 голосов
/ 16 января 2019

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

Вместо этого вам следует прекратить использование strtotime и охватить объектно-ориентированные DateTime функции.

Используя DateTime, вы можете определить дату вместе с ее часовым поясом:

// local time
$date = new \DateTimeImmutable('1/1/2019', new \DateTimeZone('Europe/Bucharest'));
echo $date->format('U > d.m.Y (e)') , '<br>';

// convert to UTC
echo $date->setTimeZone(new \DateTimeZone('UTC'))->format('U > d.m.Y (e)');

Библиотека довольно мощная и более многословная, чем работа со строками и временными метками Unix.

...