代码第一
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时间戳?
答案 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;
}