php 如何根据时区在php中获取Unix时间戳
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8668108/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to get Unix timestamp in php based on timezone
提问by jimy
Code first
代码优先
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/>';
In the above code the date is printed according to timezone but unix timestamp is same even after setting default timezone
在上面的代码中,日期是根据时区打印的,但即使设置了默认时区,unix 时间戳也是相同的
How can we print unix timestamp according to timezone?
我们如何根据时区打印unix时间戳?
回答by Cecil Zorg
The answer provided by Volkerk (that says timestamps are meant to be always UTC based) is correct, but if you really need a workaround (to make timezone based timestamps) look at my example.
Volkerk 提供的答案(即时间戳意味着始终基于 UTC)是正确的,但如果您确实需要一种解决方法(以制作基于时区的时间戳),请查看我的示例。
<?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";
?>
Get the regular timestamp and add the UTC offset
获取常规时间戳并添加 UTC 偏移量
回答by VolkerK
https://en.wikipedia.org/wiki/Unix_time
https://en.wikipedia.org/wiki/Unix_time
Unix time, or POSIX time, is a system for describing instants in time, defined as the number of seconds elapsed since midnight Coordinated Universal Time (UTC)of Thursday, January 1, 1970
Unix 时间或 POSIX 时间是一种用于描述时间瞬间的系统,定义为自1970 年 1 月 1 日星期四协调世界时 (UTC) 午夜以来经过的秒数
The unix timestamp isn't affected by a timezone setting. Setting the timezone only affects the interpretation of the timestamp value.
unix 时间戳不受时区设置的影响。设置时区只影响时间戳值的解释。
回答by dalslandan200
Had the same issue myself, and this is the easiest approach I could do fairly quickly.
我自己也有同样的问题,这是我可以很快做的最简单的方法。
$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);
回答by Iliya Kolev
Saw the answers with the offset solution and I think that unless you save you times in the database in UTC or Unix timestamp they won't help. The problem, when it comes to getTimestamp(), is that the timezone is not considered even when you initiate the object... How do I explain it :)... let's say you have some event with date and time in you db. You also have you timezone correctly configured. I'll put these in vars for this example, so it's more visible:
看到了偏移解决方案的答案,我认为除非您以 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());`
Now...when you do this, you pass the datetime and your timezone to the constructor. What you would expect is that php respects your timezone and you get UTC timestamp that corresponds to 16:45 in Berlin which would be UTC 15:45 in winter and UTC 14:45 in summer. It won't happen - what you get is timestamp corresponding to UTC 16:45. If you add the offset now you will be hour or two off.
现在......当你这样做时,你将日期时间和你的时区传递给构造函数。您所期望的是 php 尊重您的时区,并且您获得对应于柏林 16:45 的 UTC 时间戳,冬季为 UTC 15:45,夏季为 UTC 14:45。它不会发生 - 你得到的是对应于 UTC 16:45 的时间戳。如果您现在添加偏移量,您将减少一两个小时。
The correct way to do this is to initiate the object, set/switch timezones, create a formatted datetime which respects the timezone and then get timestamp from the formatted datetime. It might be a bit slower, but it's timezone fail prove:
正确的方法是启动对象,设置/切换时区,创建一个符合时区的格式化日期时间,然后从格式化的日期时间中获取时间戳。它可能会慢一点,但它的时区失败证明:
$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();
回答by MR_AMDEV
Here is a function to convert unix/gmt/utc timestamp to required timezone.
这是一个将 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;
}