У меня есть некоторые функции локализации в моем веб-приложении (предоставляемые через Ajax), которые позволяют пользователям отображать некоторую информацию о дате и времени в своем собственном часовом поясе, а также в часовом поясе, относящемся к местоположению объекта, к которому в первую очередь относятся данные.
В результате некоторого тестирования я обнаружил, что, хотя мой код способен точно преобразовывать значения даты / времени, полученные из БД (т.е. включая корректировки DST), код не будет вычислять правильные смещения, когда я использую даты, предоставленные в форме , Лучшее, чего мне удалось добиться, — это преобразовать значение даты / времени формы в UTC, но применяется неправильное смещение. Это означает, что мне нужно проверить, попадает ли дата в диапазон перехода на летнее время, и если это так, вернуть значение datetime на час. Это выглядит ужасно, и я буду признателен, если кто-нибудь знает, где я ошибся:
Пример:
Если я использую предоставленное в форме значение (которое мне нужно проверить, если пользователь обновил значение, не сохраняя его), происходит следующее:
ОТ БД1 = 2018-11-25 03:00:00 (значение в БД, в UTC)
Код следует:
echo "FROM DB1: ".$getListing['lo_deadline']."<BR />";
echo "FROM FORM1:".$in_lo_deadline."<BR />";
$frmDateTime = DateTime::createFromFormat($this->view->user->user_datetimeformat, $in_lo_deadline,new DateTimeZone($list_tmzn));
echo "FROM FORM2:".$frmDateTime->format('Y-m-d h:i:s')."<BR />";
//If $frmDateTime is in daylight savings then subtract an hour to arrive at the correct UTC value
if ($frmDateTime->format('I'))
{
date_sub($frmDateTime, date_interval_create_from_date_string('1 hours'));
}
echo "FROM FORM3:".$frmDateTime->format('Y-m-d h:i:s')."<BR />";
$dates['set_dead'] = convertUserDate($frmDateTime->format('Y-m-d h:i:s'), $this->view->user->user_datetimeformat, $user_tmzn,'UTC');
Что я понимаю из вашего кода, почему он показывает 2018-11-25 04:00:00
это из-за формата AM / PM. Вы должны использовать капитал H
вместо h
в вашем коде.
Вы должны понимать разницу между 24-часовым и 12-часовым форматами. 2018-11-25 04:00:00
в соответствии с вашим форматом в формате AM / PM или 12-часовом формате, но в 24-часовом формате это должно быть 2018-11-25 16:00:00
, Время базы данных всегда в 24-часовом формате.
+ Изменить
$frmDateTime->format('Y-m-d h:i:s')
в
$frmDateTime->format('Y-m-d H:i:s')
Замечания: Вам не нужно вручную вычитать час, чтобы рассчитать переход на летнее время, так как php делает это автоматически.
Других решений пока нет …