【问题标题】:Moment.js - How To Detect Daylight Savings Time And Add One DayMoment.js - 如何检测夏令时并添加一天
【发布时间】:2014-03-22 00:04:52
【问题描述】:

我需要从 2000 年以来的每一天每一小时的日期数据字符串中创建日期对象。

每个小时的字符串都是这样的,格式为Month/Day/Year Hour...

"04/02/2000 01", "04/02/2000 02", "04/02/2000 03" ...all the way to... "04/02/2000 24"

现在,我有以下代码,除了夏令时之外,它可以正常工作...

  // Split At Space
var splitDate = "04/02/2000 24".split(/[ ]+/);
var hour = splitDate[1];
var day  = splitDate[0];
  // Split At Slashes
var dayArray = day.split("/");
if (hour === "24") {
       // Months are zero-based, so subtract 1 from the month
     date = new Date(Date.UTC( dayArray[2], parseInt(dayArray[0] - 1), dayArray[1], 0, 0, 0 ));
     date.setDate(date.getDate() + 1);
} else {
     // Months and Hours are zero-based, so subtract 1 from each
     date = new Date(Date.UTC( dayArray[2], parseInt(dayArray[0] - 1), dayArray[1], hour, 0, 0 ));
};

在有夏令时的日子,例如04/02/2000,如果小时为24,则添加一天不起作用。相反,它只返回Sun, 02 Apr 2000 23:00:00 GMT

使用 Moment.js,是否可以检测 DST 日并让此代码正常工作?

【问题讨论】:

    标签: javascript date momentjs


    【解决方案1】:

    要检测 DST,请使用 .isDST() 方法:http://momentjs.com/docs/#/query/is-daylight-saving-time/

    moment([2011, 2, 12]).isDST(); // false, March 12 2011 is not DST
    moment([2011, 2, 14]).isDST(); // true, March 14 2011 is DST
    

    使用此测试,您应该能够确定如何相应地修改程序的行为。

    【讨论】:

    • 值得一提的是 isDST() 取决于国家和地区。给出的示例对于比利时都将返回 false。 timeanddate.com/time/dst/2011.html
    • 即使在美国部分地区,它也会返回 false,因为美国有一些小口袋不使用 DST。事实上,世界上没有很多国家使用 DST。
    • 这是错误的。 DST 在北美和欧洲以及其他国家广泛使用。请参阅维基百科的此链接:en.wikipedia.org/wiki/Daylight_saving_time_by_country
    • 这段代码是否返回是否是夏令时,夏令时开始的日期/小时是否改变?
    • 我试过这段代码,它们都返回 false。我在佛罗里达州运行它,那里有夏令时。我错过了什么?我需要设置区域吗?
    【解决方案2】:

    我是这样制作一个小检查器的:

    var curDst = dtdate.isDST()
    var prevDst = moment(dtdate).clone().subtract(1, "day").isDST();
    var nextDst = moment(dtdate).clone().add(1, "day").isDST();
    var isDstChangeDate = (curDst !== nextDst) === true || (curDst === prevDst) !== true;
    

    【讨论】:

    • 这不适用于所有时区。即Iran 时区,2018-03-22 是真正的 DST 更改日,但按照这种逻辑,2018-03-21 将是 DST 更改日...
    • 我实际上已经在自己的代码中修改了检查器。我更新了答案。
    • @red,您的代码对于Iran 时区的2018-03-222018-03-23 都返回true
    猜你喜欢
    • 2017-12-26
    • 2011-09-03
    • 2013-01-15
    • 2014-04-25
    • 2023-03-26
    • 2016-06-18
    • 2016-02-24
    • 2013-11-22
    相关资源
    最近更新 更多