13

我有一个设置为 +5 的 unix 时间戳,但我想将其转换为 -5,即 EST 标准时间。我只想在那个时区生成时间戳,但我从另一个来源获取它,它把它放在 +5 处。

当前未修改的时间戳被转换为日期

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

4 回答 4

42

使用DateTimeDateTimeZone

$dt = new DateTime('@1369490592');
$dt->setTimeZone(new DateTimeZone('America/Chicago'));
echo $dt->format('F j, Y, g:i a');
于 2013-05-25T14:23:51.780 回答
0

因为约翰康德答案的编辑队列已满,所以我将添加更详细的答案。

DateTime::__construct(string $time, DateTimeZone $timezone)

当 $time 参数是 UNIX 时间戳(例如 @946684800)时 ,$timezone 参数和当前时区将被忽略...</p>

DateTime这是从 unix 时间戳创建对象时应始终指定时区(甚至是默认时区)的主要原因。请参阅受John Conde 回答启发的解释代码:

$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');
于 2017-06-13T09:36:17.767 回答
0

这是一个将 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;
}
于 2019-07-11T18:49:03.730 回答
0

一个更简单的方法是:

使用gmdate()时,以秒为单位将您的时区添加到 gmdate 中的 unix_stamp。

考虑我的时区是 GMT+5:30。所以5 小时 30 分以秒为单位将是19800

所以,我会这样做:

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

于 2017-07-31T04:33:47.923 回答