Ответ 1
Используйте DateTime и DateTimeZone:
$dt = new DateTime('@1369490592');
$dt->setTimeZone(new DateTimeZone('America/Chicago'));
echo $dt->format('F j, Y, g:i a');
У меня есть временная метка unix, которая установлена на +5, но я бы хотел преобразовать ее в -5, EST стандартное время. Я бы просто создал временную метку в этом часовом поясе, но я хватаю ее из другого источника, который помещает его в +5.
Текущая немодифицированная временная метка, конвертированная в дату
<? echo gmdate("F j, Y, g:i a", 1369490592) ?>
Используйте DateTime и DateTimeZone:
$dt = new DateTime('@1369490592');
$dt->setTimeZone(new DateTimeZone('America/Chicago'));
echo $dt->format('F j, Y, g:i a');
Как потому, что очередь редактирования для ответа Джона Конде заполнена, я добавлю более подробный ответ.
Из DateTime::__construct(string $time, DateTimeZone $timezone)
Параметр $timezone и текущий часовой пояс игнорируются, когда $time - это временная метка UNIX (например, @946684800)...
Это основная причина, по которой вы всегда должны указывать часовой пояс, даже по умолчанию, при создании объектов DateTime
из метки времени unix. См. Объясненный код, вдохновленный ответом Джона Конде:
$dt = new DateTime('@1369490592');
// use your default timezone to work correctly with unix timestamps
// and in line with other parts of your application
date_default_timezone_set ('America/Chicago'); // somewhere on bootstrapping time
…
$dt->setTimeZone(new DateTimeZone(date_default_timezone_get()));
// set timezone to convert time to the other timezone
$dt->setTimeZone(new DateTimeZone('America/Chicago'));
echo $dt->format('F j, Y, g:i a');
проще:
При использовании gmdate()
добавьте часовой пояс в секундах в unix_stamp в gmdate.
Рассмотрим мой часовой пояс GMT + 5: 30. Таким образом, 5 часов 30 минут в секундах будет 19800
Итак, я сделаю это:
gmdate("F j, Y, g:i a", 1369490592+19800)
Вот функция для конвертации метки времени unix/gmt/utc в необходимый часовой пояс, которая может вас заинтересовать.
function unix_to_local($timestamp, $timezone){
// Create datetime object with desired timezone
$local_timezone = new DateTimeZone($timezone);
$date_time = new DateTime('now', $local_timezone);
$offset = $date_time->format('P'); // + 05:00
// Convert offset to number of hours
$offset = explode(':', $offset);
if($offset[1] == 00){ $offset2 = ''; }
if($offset[1] == 30){ $offset2 = .5; }
if($offset[1] == 45){ $offset2 = .75; }
$hours = $offset[0].$offset2 + 0;
// Convert hours to seconds
$seconds = $hours * 3600;
// Add/Subtract number of seconds from given unix/gmt/utc timestamp
$result = floor( $timestamp + $seconds );
return $result;
}