在用户的时区显示当前时间,不要忘记夏令时

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() 方法会自动给出结果 基于用户(客户端)的时区。

【讨论】:

以上是关于在用户的时区显示当前时间,不要忘记夏令时的主要内容,如果未能解决你的问题,请参考以下文章

获取节点 js 服务器上特定时区的当前时间

如何在android中处理时区和夏令时?

C# 英国夏令时 (BST) 时区缩写

使用 Python 找出当前是不是处于夏令时的时区 [重复]

针对当前时区调整的不同夏令时的UTC日期[重复]

Calendar日期类详解SimpleDateFormat时区Date夏令时常用方法,日期差获取当前时间