Преобразовать временную метку Unix в часовой пояс?

У меня есть временная метка unix, которая установлена ​​на +5, но я бы хотел преобразовать ее в -5, EST стандартное время. Я бы просто создал временную метку в этом часовом поясе, но я хватаю ее из другого источника, который помещает его в +5.

Текущая немодифицированная временная метка, конвертированная в дату

<? echo gmdate("F j, Y, g:i a", 1369490592) ?>

Ответ 1

Используйте DateTime и DateTimeZone:

$dt = new DateTime('@1369490592');
$dt->setTimeZone(new DateTimeZone('America/Chicago'));
echo $dt->format('F j, Y, g:i a');

Ответ 2

Как потому, что очередь редактирования для ответа Джона Конде заполнена, я добавлю более подробный ответ.

Из 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');

Ответ 3

проще:

При использовании gmdate() добавьте часовой пояс в секундах в unix_stamp в gmdate.

Рассмотрим мой часовой пояс GMT + 5: 30. Таким образом, 5 часов 30 минут в секундах будет 19800

Итак, я сделаю это:

 gmdate("F j, Y, g:i a", 1369490592+19800)

Ответ 4

Вот функция для конвертации метки времени 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;
}