如何在php中根据时区获取Unix时间戳

时间:2011-12-29 12:53:40

标签: php timezone unix-timestamp

代码第一

    echo time() . '<br/>';
echo date('Y-m-d H:i:s') . '<br/>';
date_default_timezone_set('America/New_York'); 

echo time() . '<br/>';
print_r($timezones[$timezone] . '<br/>');
echo date('Y-m-d H:i:s') . '<br/>';

在上面的代码中,日期是根据时区打印的,但即使在设置默认时区后,unix时间戳也相同

我们如何根据时区打印unix时间戳?

5 个答案:

答案 0 :(得分:31)

Volkerk提供的答案是正确的,但如果你真的需要一个解决方案来看看我的例子。

<?php

//default timezone
$date = new DateTime(null);
echo 'Default timezone: '.$date->getTimestamp().'<br />'."\r\n";

//America/New_York
$date = new DateTime(null, new DateTimeZone('America/New_York'));
echo 'America/New_York: '.$date->getTimestamp().'<br />'."\r\n";

//Europe/Amsterdam
$date = new DateTime(null, new DateTimeZone('Europe/Amsterdam'));
echo 'Europe/Amsterdam: '.$date->getTimestamp().'<br />'."\r\n";

echo 'WORK AROUND<br />'."\r\n";
// WORK AROUND
//default timezone
$date = new DateTime(null);
echo 'Default timezone: '.($date->getTimestamp() + $date->getOffset()).'<br />'."\r\n";

//America/New_York
$date = new DateTime(null, new DateTimeZone('America/New_York'));
echo 'America/New_York: '.($date->getTimestamp() + $date->getOffset()).'<br />'."\r\n";

//Europe/Amsterdam
$date = new DateTime(null, new DateTimeZone('Europe/Amsterdam'));
echo 'Europe/Amsterdam: '.($date->getTimestamp() + $date->getOffset()).'<br />'."\r\n";
?>

获取常规时间戳并添加UTC偏移量

答案 1 :(得分:20)

https://en.wikipedia.org/wiki/Unix_time

Unix时间或POSIX时间是用于描述时间瞬间的系统,定义为自1970年1月1日星期四起午夜协调世界时(UTC)以来经过的秒数

unix时间戳不受时区设置的影响。设置时区仅影响时间戳值的解释。

答案 2 :(得分:2)

我自己也有同样的问题,这是我能够很快做到的最简单的方法。

$dateTimeZone = new DateTimeZone("America/New_York");
$dateTime = new DateTime("now", $dateTimeZone);
$timeOffset = $dateTimeZone->getOffset($dateTime);

// New time since epoch according to timezone
$newTime = time() + $timeOffset;

echo date("H:i:s", $newTime);

答案 3 :(得分:0)

看到偏移量解决方案的答案,我认为除非您在UTC或Unix时间戳中在数据库中节省时间,否则它们将无济于事。当涉及到getTimestamp()时,问题是即使启动对象时也不会考虑时区...我该如何解释:)...假设您在数据库中有一些带有日期和时间的事件。您还正确配置了时区。在本例中,我将它们放在vars中,这样更明显:

$dateTime = '25.08.2018 16:45:15';//some event in your db //can be any valid format
$localTimezone = 'Europe/Berlin';
$dateTimeLocal = new \DateTime($dateTime, new \DateTimeZone($localTimezone));
var_dump($dateTimeLocal->getTimestamp());`

现在...执行此操作时,会将日期时间和时区传递给构造函数。您所期望的是,php尊重您的时区,并且您获得的UTC时间戳与柏林的16:45相对应,冬季为UTC 15:45,夏季为UTC 14:45。这不会发生-您得到的是与UTC 16:45对应的时间戳。如果现在添加偏移量,您将减少一两个小时。

执行此操作的正确方法是初始化对象,设置/切换时区,创建尊重时区的格式化日期时间,然后从格式化日期时间获取时间戳。可能会慢一点,但是时区失败证明:

$date = '25.08.2018 16:45:15';//some event in your db //can be any valid format
$format = 'Y-m-d H:i:s';//just a format we will use for this example //also can be any valid format
$localTimezone = 'Europe/Berlin';
$remoteTimezone = 'America/Lima';
$dateTime = new \DateTime($date, new \DateTimeZone($localTimezone));
$dateTime->setTimezone(new \DateTimeZone($remoteTimezone));
$timestampLima = DateTime::createFromFormat($format, $dateTime->format($format))->getTimestamp();

答案 4 :(得分: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;
}