如何在php中基于时区获取Unix时间戳



代码优先

    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时间戳?

Volkerk提供的答案(说时间戳意味着总是基于UTC)是正确的,但如果你真的需要一个解决方法(制作基于时区的时间戳)看看我的例子。

<?php
//default timezone
$date = new DateTime(null);
echo 'Default timezone: '.$date->getTimestamp().'<br />'."rn";
//America/New_York
$date = new DateTime(null, new DateTimeZone('America/New_York'));
echo 'America/New_York: '.$date->getTimestamp().'<br />'."rn";
//Europe/Amsterdam
$date = new DateTime(null, new DateTimeZone('Europe/Amsterdam'));
echo 'Europe/Amsterdam: '.$date->getTimestamp().'<br />'."rn";
echo 'WORK AROUND<br />'."rn";
// WORK AROUND
//default timezone
$date = new DateTime(null);
echo 'Default timezone: '.($date->getTimestamp() + $date->getOffset()).'<br />'."rn";
//America/New_York
$date = new DateTime(null, new DateTimeZone('America/New_York'));
echo 'America/New_York: '.($date->getTimestamp() + $date->getOffset()).'<br />'."rn";
//Europe/Amsterdam
$date = new DateTime(null, new DateTimeZone('Europe/Amsterdam'));
echo 'Europe/Amsterdam: '.($date->getTimestamp() + $date->getOffset()).'<br />'."rn";
?>

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

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

Unix时间,或POSIX时间,是一个描述时间瞬间的系统,定义为从协调世界时(UTC) 1970年1月1日星期四的午夜开始经过的秒数

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

我自己也有同样的问题,这是我能快速完成的最简单的方法。

$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);

看到答案与偏移解决方案,我认为,除非你节省你的时间在数据库中的UTC或Unix时间戳,他们不会有帮助。当涉及到getTimestamp()时,问题在于即使在初始化对象时也不会考虑时区…我该怎么解释呢?假设您的数据库中有一些带有日期和时间的事件。您还正确配置了时区。在本例中,我将把它们放在var中,这样更容易看到:

$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相对应的时间戳。如果你现在加上偏移量,你会有一两个小时的误差。

正确的方法是初始化对象,设置/切换时区,创建一个格式化的datetime,它尊重时区,然后从格式化的datetime中获取时间戳。它可能有点慢,但它的时区失败证明:

$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();

使用time()获得的unix时间戳无论如何都不受时区的影响。当您希望获得给定日期的unix时间戳(如2022-09-11 13:00),或者当您希望以日历方式显示unix时间戳时,时区是相关的。

因此,如果您想获得特定时区中给定日期的unix时间戳,请使用strtotime()函数并包含timezone参数。

$unixTimestampOfDate = strtotime('2022-09-11 13:00 Europe/Berlin');

如果您想在给定的时区中以日历方式显示unix时间戳,请设置默认时区,然后使用date()函数。

date_default_timezone_set('Europe/Berlin');
echo date('Y-m-d H:i', $unixTimestamp);

下面是一个将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;
}

相关内容

  • 没有找到相关文章

最新更新