在用户的时区显示当前时间,不要忘记夏令时
Posted
技术标签:
【中文标题】在用户的时区显示当前时间,不要忘记夏令时【英文标题】:Display current time in user's timezone not forgetting about the daylight saving time 【发布时间】:2012-01-16 15:50:48 【问题描述】:我知道有很多类似的问题,但我没有找到我真正需要的...
所以我正在使用 php,我想在访问者当前时区显示数据库中的时间戳。
到目前为止,我已经完成了以下工作:
在 PHP 中,我到处使用 $TIME,即:
$TIME = time() - date("Z");
这应该是对时间的绝对引用,没有 dst,对吗?
我用javascript获取用户的时区偏移量(仅在第一次访问时),并以分钟为单位存储:
var d = new Date();
var tz = -d.getTimezoneOffset();
当然,用户可以将他/她的时区设置为另一个。
当显示来自数据库的日期时,我将存储的时间量添加到时间戳:
$timestamp += $TIMEZONE_OFFSET * 60;
我用 date() 格式化它
这似乎运作良好,但我想知道如果涉及到 dst。
当涉及到 dst 时,我想以某种方式自动更改用户的时区偏移量,但随后所有日期都会更改(那些也不在 dst 期间的日期)。并不是每个地区都使用 dst,所以我真的很困惑如何解决这个问题:\
【问题讨论】:
【参考方案1】:首先,time()
和 date()
取决于 INI 设置 date.timezone
以及 DST。对于绝对时间,您应该改用gmmktime()
和gmdate()
。
可以解析有关时区 DST 的信息,例如,DateTimeZone::getTransitions()
。
或者您可以改用一些 3rd-party 服务。
【讨论】:
【参考方案2】:我会以基于 UTC 的 Unix date() 格式发送所有时间戳, 独立于时区、夏令时等。在 PHP 方面:
$php_timestamp = gettimeofday(true);
在 JavaScript 方面:
var js_timestamp = new Date(php_timestamp*1000);
然后所有的getFullYear,Month,Date,Hours,...()
和
to[Locale]Date,Time,String()
方法会自动给出结果
基于用户(客户端)的时区。
【讨论】:
以上是关于在用户的时区显示当前时间,不要忘记夏令时的主要内容,如果未能解决你的问题,请参考以下文章