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

Javascript 查找给定日期和时间是否在DST的空段中,javascript,timezone,dst,Javascript,Timezone,Dst,我的客户端和服务器位于UTC(+1245)查塔姆群岛时区 在此时区,时钟将提前一小时从2018年9月30日02:45到2018年9月30日03:45 我希望如果有人在这两个小时之间设置时间,它应该通知用户。我使用了下面的代码来查找它,但它没有显示出来 Date.prototype.stdTimezoneOffset=function(){ var jan=新日期(2018年0月1日); var jul=新日期(2018年6月1日); 返回Math.max(jan.getTimezoneOffs

我的客户端和服务器位于UTC(+1245)查塔姆群岛时区

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

我希望如果有人在这两个小时之间设置时间,它应该通知用户。我使用了下面的代码来查找它,但它没有显示出来

Date.prototype.stdTimezoneOffset=function(){
var jan=新日期(2018年0月1日);
var jul=新日期(2018年6月1日);
返回Math.max(jan.getTimezoneOffset(),jul.getTimezoneOffset());
}
Date.prototype.isDstObserved=函数(){
返回此.getTimezoneOffset()

有什么帮助吗?

JavaScript中的
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相关

如果需要特定于特定时区而不是用户本地时区,则需要使用支持此类内容的库,并在指定时区时采用与上述类似的方法。例如,我们可以这样使用:

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月。

如何获取时区?如果DST发生在你描述的时间,那么当天02:55的时间将不存在,那么询问DST是否保持该时间意味着什么?@ArndtJonasson如果用户给出这些值,那么如何识别它在空的DST段中呢?我想如果你得到一个返回的有效日期,你可以检查它的小时和分钟字段是否与你输入的相同,但是我不确定在验证日期字段时通常的做法是什么。另一方面,当一个小时内有两种可能的解释时,你会遇到更大的问题。
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