【问题标题】:Set the countdown to date and time, with client's timezone使用客户的时区将倒计时设置为日期和时间
【发布时间】:2018-11-14 08:50:38
【问题描述】:
var countDownDate = new Date("March 5, 2019 05:00:00").getTime();

var x = setInterval(function() {

    var now = new Date().getTime();
    var distance = countDownDate - now;
    var days = Math.floor(distance / (1000 * 60 * 60 * 24));
    var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
    var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
    var seconds = Math.floor((distance % (1000 * 60)) / 1000);
    document.getElementById("countdown").innerHTML = days + "d " + hours + "h " + minutes + "m " + seconds + "s ";
    if (distance < 0) {
        clearInterval(x);
        document.getElementById("countdown").innerHTML = "EXPIRED";
    }
}, 1000);

Date 是倒计时在莫斯科时区结束的时间,但我希望倒计时计时器为其他用户考虑时区:所以如果它在 MSK 上午 5 点结束,那么它应该在美国东部时间晚上 10 点结束地区等

【问题讨论】:

    标签: javascript timezone countdown timezone-offset


    【解决方案1】:

    问题的症结在于你的第一行代码:

    var countDownDate = new Date("March 5, 2019 05:00:00").getTime();
    

    您传递给Date 对象的字符串是非标准格式,并且不包含任何时区偏移信息,因此将始终以用户的本地时区进行解释。

    如果您确信您知道用户此时在该日期处于 UTC+3,那么您只需将输入字符串更改为带有时区偏移的 ISO 8601 格式:

    var countDownDate = new Date("2019-03-05T05:00:00+03:00").getTime();
    

    但是,这只适用于这里,因为莫斯科目前不遵守夏令时。 It did in the past thoughother Russian time zones have switched offsets recent years,所以硬编码偏移量不一定是最好的方法。它当然不适用于具有 DST 的时区,除非您在服务器端代码中确定正确的偏移量。

    如果您想要一种在任何时区都能正常工作的方法,您需要使用库 as described here

    例如,使用date-fns-tz 扩展至date-fns

    zonedTimeToUtc("2019-03-05 05:00:00", "Europe/Moscow").getTime();
    

    或者使用Luxon:

    DateTime.fromISO("2019-03-05T05:00:00", { zone: "Europe/Moscow" }).toMillis()
    

    【讨论】:

    • 我明白了。我已将时间更改为格林威治标准时间 01:00:00,因为使用格林威治标准时间似乎更容易一些,但是,当我尝试从 Geokeeper 检查它时,它每次都显示 NaN。如果需要,我可以提供 github repo。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    相关资源
    最近更新 更多