将倒计时设置为日期和时间以及客户所在的时区

时间:2018-11-14 08:50:39

标签: javascript timezone countdown timezone-offset

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 5AM结束,则应该以用户东部时间10PM结束在那个地区,等等。

1 个答案:

答案 0 :(得分:0)

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

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 though {{中的otherRussian time zones have switched offsets recent 3}},因此对偏移量进行硬编码并不一定是最好的方法。除非您在服务器端代码中确定正确的偏移量,否则它肯定不适用于具有DST的时区。

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

例如,使用as described heredate-fns-tz扩展名:

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

或使用date-fns

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