unix timestamp — проблема преобразования часовых поясов в PHP

У меня есть эта функция, которая используется для преобразования даты запроса в промежуток времени 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;
}
}

3

Решение

Проблема здесь в том, что строка: return gmdate($format, $date->getTimestamp());

Отметка времени не содержит часовой пояс. Временная метка Unix — это количество секунд, потраченных с 1 января 1970 года в полночь по UTC. Это то же самое, независимо от часового пояса. Поэтому, когда вы используете $date->getTimestamp() вы «теряете» метаду часового пояса $date объект.

Таким образом, вы можете исправить свой код, изменив

return gmdate($format, $date->getTimestamp());

от

return $date->format($format);

Надеюсь, это поможет.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector