我的客户端和服务器位于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!");
}
任何帮助?
答案 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月。