世界时、夏令时和 JavaScript

Universal Time, Daylight Savings and JavaScript

本文关键字:JavaScript 夏令时 世界      更新时间:2023-09-26

我正在尝试编写一个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 合作没有问题,我只需要帮助找出夏令时的解决方法,因为这超出了我的知识领域。

案例 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;

困难的部分是你显示消息并期望它根据东部时间而变化。如果用户弹出页面并将其保留到东部标准时间开始,该怎么办?你需要处理吗?如果美国东部时间快下午 2 点并且页面弹出怎么办?您是否必须在几分钟后弹出消息?

案例3

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

这是使用库最容易做到的。 使用时刻.js与时刻时区:

$(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.');
    }
});

请务必包含时区数据构建器中America/New_York区的数据。 这是美国东部时间的 IANA 时区标识符。

这里的主要优点是,您可以用当地时间来表示您的小时数,这将自动考虑夏令时的任何变化。 换句话说,这些时间位于美国的"东部时间"区域,而不必专门使用"东部标准时间"或"东部夏令时间"。