У меня есть эта функция, которая используется для преобразования даты запроса в промежуток времени GMT00 Unix и сохранить этот промежуток времени в базе данных.
Когда я пытаюсь преобразовать временной интервал GMT00 в действительный часовой пояс GMT, такой как GMT + 4: 00, то функция ниже возвращает неправильный временной интервал
/ ** * Конвертировать дату и время из одного часового пояса в другой часовой пояс * * @param $ datetime (строка): значение даты и времени, которое необходимо преобразовать * @param $ is_timestamp (логическое значение): если $ datetime является отметкой времени, тогда true, иначе false * @param $ stimezone (string): часовой пояс, из которого нужно конвертировать дату и время * @param $ dtimezone (строка): часовой пояс, в который необходимо преобразовать дату и время * @param $ format (string): формат, в котором вам нужны дата и время * * @return (разное) Преобразованная строка даты и времени, ноль при ошибке * /
public static function convertDateTime($datetime, $is_timestamp = false, $stimezone = "GMT+00:00", $dtimezone = "GMT+00:00", $format = null) {
if ($is_timestamp) {
$datetime = date("Y-m-d H:i:s", $datetime);
} else {
$datetime = date("Y-m-d H:i:s", strtotime($datetime));
}
try {
$date = new \DateTime($datetime, new \DateTimeZone($stimezone));
$date->setTimezone(new \DateTimeZone($dtimezone));
if (!empty($format)) {
//return $date->format($format);
return gmdate($format, $date->getTimestamp());
} else {
return $date->getTimestamp();
}
} catch (\Exception $e) {
return null;
}
}
Проблема здесь в том, что строка: return gmdate($format, $date->getTimestamp());
Отметка времени не содержит часовой пояс. Временная метка Unix — это количество секунд, потраченных с 1 января 1970 года в полночь по UTC. Это то же самое, независимо от часового пояса. Поэтому, когда вы используете $date->getTimestamp()
вы «теряете» метаду часового пояса $date
объект.
Таким образом, вы можете исправить свой код, изменив
return gmdate($format, $date->getTimestamp());
от
return $date->format($format);
Надеюсь, это поможет.
Других решений пока нет …