【问题标题】:Universal Time, Daylight Savings and JavaScript世界时、夏令时和 JavaScript
【发布时间】:2013-10-23 16:09:40
【问题描述】:

我正在尝试编写一个 JavaScript 代码,该代码将在一天中的两个小时之间显示某条消息。我们是在东部标准时间,但我使用通用时间没有问题,因为这使得编写脚本更容易。到目前为止,我有这个并且效果很好,但是,我完全不知道如何使用夏令时。

$(document).ready(function(){
    var todaysDate = new Date();
    var weekday = todaysDate.getDay();
    var universalhour = todaysDate.getUTCHours();

if (weekday >= 0) {
    if (weekday <= 4) {
        if (universalhour >= 14) {
            if (universalhour < 23) {
                $('div#announcements span').append('<br />Open.');
            }
        }
    }
}
if (weekday == 5) {
    if (universalhour >= 14) {
        if (universalhour < 20) {
            $('div#announcements span').append('<br />Open.');
        }
    }
}
});

基本上,“开放”消息应仅在美国东部标准时间上午 10 点至晚上 8 点、美国东部标准时间周日至周四和美国东部标准时间上午 10 点至周五下午 4 点之间显示。

我与 UST 合作没有问题,我只需要帮助找出夏令时的解决方法,因为这超出了我的知识领域。

【问题讨论】:

  • getDay 不是 UTC 版本,因此取决于位置,也许您的意思是 getUTCDay
  • 可以查看夏令时是否生效stackoverflow.com/questions/11887934/…
  • @jorgebg 仅适用于客户端机器上的本地时区。并非每个地方都会同时更改为 DST,有些地方根本不会。
  • @jorgebg 我使用这个 + EST 偏移量来编写我的脚本。发布答案,我会接受。

标签: javascript jquery datetime utc dst


【解决方案1】:

案例 1

如果您的计算机设置为在东部时区运行并且您使用此更改:

var hour = todaysDate.getHours();

然后在所有测试中使用该变量。

这应该会解决它。

案例 2

如果您正在编写 JavaScript 以在某些网络/互联网连接结束时在客户端计算机上运行,​​您将需要从服务器向客户端传递一些内容,以便 javascript 可以 告诉东部时区的时间。

所以你可以在你的网页中包含以下内容

<script>
   // The global value is filled in by the server based on current time on your server which is
   //  running EST or can calculate it. That code might be PHP or Java or Ruby or ...
   var ESTOffset = 5.0; 
</script>

那么你必须使用这样的计算:

 var hour = todaysDate.getUTCHours() + ESTOffset;

这方面的难点在于您显示消息并期望它根据东部时间而改变。如果用户弹出页面并在 EST 开始 DST 之前将其保留怎么办?你需要处理吗?如果它在美国东部标准时间快到下午 2 点并且页面弹出怎么办?是不是要几分钟后才弹出消息?

案例 3

如果您需要在运行任意时区的计算机上计算 EST 时间(包括 DST),您就有麻烦了。 javascript 中没有任何内容可以让您问“美国纽约几点了?”。您将需要一些了解规则的库,并且如果 EST 中的规则发生更改,您将必须更新(或确保更新)。或者您可以自己添加一些代码,这些代码知道 DST 何时以 EST 开始和结束并进行数学运算。当然,如果规则发生变化,你必须更新代码。

【讨论】:

  • 大声笑不,到最后一部分。不幸的是,我无法控制我的服务器,所以我只剩下这些我不太擅长的 JavaScript hack。
【解决方案2】:

使用库最容易做到这一点。将moment.jsmoment-timezone 一起使用:

$(document).ready(function(){

    var now = moment().tz("America/New_York");
    var weekday = now.day();
    var hour = now.hour();

    var isOpen = (weekday >= 0 && weekday <= 4 && hour >= 10 && hour < 20) || 
                 (weekday == 5 && hour >= 10 && hour < 16);

    if (isOpen) {
        $('div#announcements span').append('<br />Open.');
    }
});

确保包含来自time zone data builderAmerica/New_York 区域的数据。这是美国东部时间的 IANA 时区标识符。

这里的主要优点是您可以用当地时间表示您的时间,这将自动考虑夏令时的任何变化。换句话说,这些时间是在美国“东部时间”区域,而不是必须明确地在“东部标准时间”或“东部夏令时间”中。

【讨论】:

  • 不要忘记,如果东部时区的 DST 规则发生变化,事情将需要在未来某个不确定的时间进行更新。
  • @LeeMeador - 好点。这就是为什么每年都有多次 TZDB 更新的原因。幸运的是,在美国,他们往往会提前宣布这些事情,但在世界某些地区,他们可以在短时间内更改。
猜你喜欢
  • 2012-03-21
  • 1970-01-01
  • 2023-03-20
  • 2013-07-16
  • 2011-04-30
  • 2011-06-21
  • 2013-10-13
  • 2012-10-23
  • 2016-02-02
相关资源
最近更新 更多