我的客户端和服务器采用UTC(+1245) 查塔姆群岛时区
在此时区,时钟将从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!");
}
有什么帮助吗?
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 开始方面有所不同。 我在上面考虑了这一点(两个函数都是基于 1 的),但在问题中的代码中 - 您正在测试 10 月,而不是 9 月。