【问题标题】:Finding whether the given date and time is in Empty segment of DST查找给定的日期和时间是否在 DST 的 Empty 段中
【发布时间】:2018-03-28 06:39:29
【问题描述】:

我的客户端和服务器位于 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!");
}

有什么帮助吗?

【问题讨论】:

  • 如何获取时区?
  • 如果像你描述的那样发生夏令时,那么当天02:55的时间就不存在了,那么问夏令时是否保持那个时间是什么意思?
  • @ArndtJonasson 如果用户给出了这些值,那么如何识别它在空 DST 段中?
  • 我想如果你得到一个返回的有效日期,你可以检查它的小时和分钟字段是否等于你输入的内容,但我不确定验证日期时通常的做法是什么字段。另一端有一个更大的问题,在一小时内有两种可能的解释。

标签: javascript timezone dst


【解决方案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 月。

【讨论】:

    猜你喜欢
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2018-07-26
    • 2017-05-02
    相关资源
    最近更新 更多