Как вы обрабатываете разницу часовых поясов в PHP?
Мне говорят, что этот метод расчета местного времени пользователя иногда не работает. Какой лучший способ сделать это в PHP? Чем ты занимаешься?
public function getTimeOffset ($time) {
$this->_cacheTimeOffset();
if ($this->timeOffsetExecuted) {
$d = date("O");
$neg = 1;
if (substr($d, 0, 1) == "-") {
$neg = -1;
$d = substr($d, 1);
}
$h = substr($d, 0, 2)*3600;
$m = substr($d, 2)*60;
return $time + ($neg * ($h + $m) * -1) + (($this->timeOffset + $this->getDstInUse()) * 3600);
}
return $time;
}
4 ответа
Используйте расширение DateTime, например DateTime:: getOffset,
или DateTimeZone::getOffset
Некоторые страны могли бы выполнить обновление нескольких часовых поясов,
этот метод DateTimeZone::getTransitions раскрывает историю переходов
Только что ответил на очень похожий вопрос здесь. Я рекомендую вам проверить это; Я объяснил два предпочтительных способа вычисления смещения часового пояса (используя простую математику, а затем datetimezone
а также datetime
занятия) довольно основательно.
Первый способ был бы самым простым (и наиболее логичным), и он заключается в том, чтобы сохранить их смещение (если оно у вас уже есть) и умножить его на 3600 (1 час в секундах), а затем добавить это значение к текущая метка времени Unix, чтобы получить их окончательное время работы.
Еще один способ сделать это - использовать
DateTime
а такжеDateTimeZone
классы. Как эти два класса работают, как показано здесь, это то, что вы создаете дваDateTimeZone
объекты, один с вашим часовым поясом и один с их; создать дваDateTime
объекты с первыми параметрами"now"
а второй является ссылкой наDateTimeZone
объекты выше (соответственно); а затем позвонитеgetOffset
метод для объекта вашего часового пояса, передавая их объект часового пояса в качестве первого параметра, в конечном итоге получая вам смещение в секундах, которое можно добавить к текущей метке времени Unix, чтобы получить время, необходимое для выполнения их работы.
Быстрое решение:
<?php echo date('g:i a', strtotime("now + 10 hours 30 minutes")); ?>