Javascript date, is this my error or did I find a bug?

后端 未结 3 1513
旧时难觅i
旧时难觅i 2021-01-18 03:55

I have a section of simple Javascript in my application that has a link \"Add Day\", which adds 1 day to a date. It always works perfectly, except when the date gets to be

相关标签:
3条回答
  • 2021-01-18 04:02

    Others spotted what the problem is.

    To fix it you can use the overloaded Date constructor that takes the year, month, and day:

    var aDate = new Date(2010, 10, 07);
    var aDatePlusOneDay = new Date(aDate.getFullYear(),
                                   aDate.getMonth(),
                                   aDate.getDate() + 1, // HERE
                                   aDate.getHours(),
                                   aDate.getMinutes(),
                                   aDate.getSeconds(),
                                   aDate.getMilliseconds()); 
    

    Here's a more generic solution that can increment any date by a given millisecond amount, taking changes to daylight savings into account:

    Date.addTicks = function(date, ticks) {
      var newDate = new Date(date.getTime() + ticks);
      var tzOffsetDelta = newDate.getTimezoneOffset() - date.getTimezoneOffset();
      return new Date(newDate.getTime() + tzOffsetDelta * 60000);
    }
    

    Adding a day to a Date object then is a matter of adding the number of milliseconds in one day:

    Date.addTicks(new Date(2010, 10, 7), 86400000); // new Date(2010, 10, 8)
    

    References:

    • Date.prototype.getTimezoneOffset
    0 讨论(0)
  • 2021-01-18 04:07

    The problem is that you're adding the 24 hours to the date to add one day; Daylight Savings Time has thwarted you because 24 hours after 00:00 on November 7th will be 23:00 (for the second time) on November 7th.

    0 讨论(0)
  • 2021-01-18 04:16

    Daylight Savings Time. (In most places in the US) the time rolls back on the first Sunday of November. Your code is just adding an amount of milliseconds to the start of the day specified by the input box, and the returning the beginning of the resulting day: however because of DST, simply adding seconds and truncating the date this way will never progress the date.

    0 讨论(0)
提交回复
热议问题