【问题标题】:Changing current user timezone based on server UTC offset and user UTC offset根据服务器 UTC 偏移量和用户 UTC 偏移量更改当前用户时区
【发布时间】:2011-04-12 18:14:12
【问题描述】:

我正在用 php 编写一个 twitter 网络服务。当用户登录时,我会收到此节点:

<utc_offset>-18000</utc_offset>

我必须更改脚本的时区,使其适应用户的实际时区。我为此找到的唯一 php 函数是:date_default_timezone_set($timezone_identifier),但它不允许我使用 -18000 作为 $timezone_identifier 参数。

那么,如何根据两个值更改当前用户时区:服务器 UTC 偏移量用户 UTC 偏移量

顺便说一句,这就是我获取服务器 UTC 偏移值的方式:

$this_tz_str = date_default_timezone_get();
$this_tz = new DateTimeZone($this_tz_str);
$now = new DateTime("now", $this_tz);
$offset = $this_tz->getOffset($now);

有什么想法吗?谢谢!

【问题讨论】:

  • -18000 是偏移量而不是时区标识符。对于有效的时区标识符visit this link
  • 我会用你的 $usertime 而不是 time() 来计算日期:)

标签: php timezone utc datetimeoffset


【解决方案1】:

获取当前服务器时间

date_default_timezone_set(date_default_timezone_get());
echo date('Y-m-d H:i:s', time());

欧洲/巴黎的输出(我的服务器设置;UTC+2)

2011-04-12 20:39:43

通过偏移量获取用户时间

$user_offset = '-18000';
date_default_timezone_set('UTC');
$diff = "$user_offset seconds";
if ((substr($diff,0,1) != '+') && (substr($diff,0,1) != '-')) $diff = '+' . $diff;
$usertime = strtotime($diff, time());
echo date('Y-m-d H:i:s', $usertime);

输出 UTC-5(厄瓜多尔 -> 基多时间 NO DST),php 时区标识符'America/Guayaquil'

2011-04-12 13:39:43

PHP.net 手册:

时区偏移以秒为单位。偏移量 对于 UTC 以西的时区,总是 负数,对于 UTC 以东的那些是 总是积极的。 (-43200 通过 50400)

【讨论】:

  • 感谢您的代码,效果很好!关于找出我的时区在哪里的很好的细节呵呵。
【解决方案2】:

date_default_timezone... 函数需要一个字符串,给出类似“Africa/Luanda”之类的内容。

我建议以编程方式在时区数据库中搜索匹配的偏移量。如果我没记错的话,这些是从 UTC 开始的分钟数,所以你应该将给定的偏移量除以 60。

【讨论】:

  • 偏移量以秒为单位...如果您将 18000 除以 60,则相差 300 小时...只是不可能 UTC-300 :)
  • 18000 将是 300 分钟或 5 小时。
  • 是的,所以您应该将偏移量除以 3600 以获得 UTC-5 小时的 UTC 差异,对吧?
猜你喜欢
  • 1970-01-01
  • 2014-02-04
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 2017-10-18
  • 1970-01-01
  • 2018-03-01
相关资源
最近更新 更多