查找给定日期和时间是否在DST的空段中

时间:2018-03-28 06:39:30

标签: javascript timezone dst

我的客户端和服务器位于UTC(+1245)Chatham Islands时区

在这个时区,时钟将从2018年9月30日02:45到2018年9月30日03:45提前一小时。

我希望如果有人在这些时间之间设置时间,它应该通知用户。我已经使用以下代码来查找它,但它没有显示。

https://jsfiddle.net/tt8dmm4y/5/

Date.prototype.stdTimezoneOffset = function() {
  var jan = new Date(2018, 0, 1);
  var jul = new Date(2018, 6, 1);
  return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
}

Date.prototype.isDstObserved = function() {
  return this.getTimezoneOffset() < this.stdTimezoneOffset();
}

var checkdate = new Date(2018, 09, 30, 02, 55, 00);
if (checkdate.isDstObserved()) {
  alert("Daylight saving time!");
}

任何帮助?

1 个答案:

答案 0 :(得分:1)

JavaScript中的Date对象将始终在用户本地的时区中工作。如果您对此感到满意,那么只需将Date对象的小时和分钟与您放入的内容进行比较:

function isInvalidLocalTime(year, month, day, hour, minute) {
    var d = new Date(year, month-1, day, hour, minute);
    return d.getHours() !== hour || d.getMinutes() !== minute;
}

isInvalidLocalTime(2018, 9, 30, 3, 0) // false, but only when local time is Chatham

当提供过渡间隙中的时间时,Date对象会将其转移到其他时间(它转换的方式取决于旧版浏览器中的实现)。请注意,分钟是必需的,因为某些时区偏移转换仅为30分钟,并非所有转换都与DST相关。

如果您需要特定时区而不是用户本地时区,那么您需要使用支持此类操作的库,并在指定时区时采用与上述类似的方法。例如,我们可以像这样使用Luxon

function isInvalidLocalTime(tz, year, month, day, hour, minute) {
    var dt = luxon.DateTime.fromObject({zone: tz, year: year, month: month, day: day, hour: hour, minute: minute});
    return dt.hour !== hour || dt.minute !== minute;
}

isInvalidLocalTime('Pacific/Chatham', 2018, 9, 30, 3, 0) // false

另请注意,Date对象与Luxon DateTime的不同之处在于月份是从零开始还是从一开始。我考虑了上面的内容(两个函数都是基于1的),但是在问题的代码中 - 你是在测试10月,而不是9月。