【问题标题】:Add days to JavaScript Date将天数添加到 JavaScript 日期
【发布时间】:2010-10-08 11:36:18
【问题描述】:

如何使用 JavaScript 为当前 Date 添加天数。 JavaScript 是否有像 .Net 的 AddDay 这样的内置函数?

【问题讨论】:

    标签: javascript date datetime time


    【解决方案1】:
    var today = new Date();
    var tomorrow = new Date();
    tomorrow.setDate(today.getDate()+1);
    

    小心,因为这可能很棘手。设置tomorrow 时,它只起作用,因为它的当前值与today 的年份和月份匹配。但是,设置为像“32”这样的日期数字通常仍然可以将其移至下个月。

    【讨论】:

    • 是吗?但这是什么? (运行于 2010 年 3 月 31 日):今天 = 新日期();明天 = 新日期();明天.setDate(今天.getDate()+1);警报(明天.getMonth());说“3”。警报(明天);是正确的...为什么???
    • @sims 月份为 0 索引。第 3 个月是四月
    • 为什么需要创建 2 个单独的日期对象?为什么不简单地使用相同的日期对象:var d = new Date(); d.setDate( d.getDate() + 1 );
    • 这种方法多年都行不通。如果您的开始日期是几年前,getDate() 会返回那一年的日期。然后,调用setDate 将日期设置为当前年份。所以它不是一个很好的通用解决方案。 @AnthonyWJones's answer 实际上工作正常。
    • @DrewNoakes——你断言它不能跨年工作是错误的。 getDate 返回月份中的某一天,而不是“那一年的某一天”。例如。 var d = new Date(2015,11,30);d.setDate(d.getDate() + 370) 给出 2017 年 1 月 3 日,跨越 2 年。
    【解决方案2】:

    你可以创建一个:-

    Date.prototype.addDays = function(days) {
        var date = new Date(this.valueOf());
        date.setDate(date.getDate() + days);
        return date;
    }
    
    var date = new Date();
    
    console.log(date.addDays(5));

    这会在必要时自动增加月份。例如:

    8/31 + 1 天将变为 9/1

    直接使用setDate 的问题在于它是一个mutator,最好避免这种事情。 ECMA 认为将 Date 视为可变类而不是不可变结构是合适的。

    【讨论】:

    • 简体:Date.prototype.addDays=function(d){return new Date(this.valueOf()+864E5*d);};
    • @Duncan 你确定这和上面的一样吗?这只是增加了 24 小时,但 one day is not always 24 hours。我想问题是如何在不更改时间部分的情况下将日期部分增加 1 天。
    • 864E5 出于某种原因,我更喜欢在我的代码中写 24*60*60 :)
    • 伙计们,不要使用添加 864E5 的方法,因为这不考虑夏令时差异,天可以是 23 或 25 小时。
    • 对于那些担心夏令时的人——不要。这些算法改变了基础日期,而不是日期的解释方式。 DST 在日期的 getter 和 setter 中实现 - getter 在夏季减去一个小时,而 setter 在夏季将那个小时加回去以标准化时间。但只有在使用绝对小时时——不需要解释相对小时。这就是日期数学有效的原因。恕我直言...
    【解决方案3】:

    这些答案让我感到困惑,我更喜欢:

    var ms = new Date().getTime() + 86400000;
    var tomorrow = new Date(ms);
    

    getTime() 为我们提供自 1970 年以来的毫秒数,而 86400000 是一天中的毫秒数。 因此, ms 包含所需日期的毫秒数。

    使用毫秒构造函数给出所需的日期对象。

    【讨论】:

    • 此解决方案不考虑夏令时。因此,例如,这将在 23 小时后返回相同的日期:new Date(new Date('11/4/2012').getTime() + 86400000)
    • @NoahMiller 您提出的问题可能是功能而不是错误!每天增加 24 小时有时是正确的做法,目的是了解基于 DST 的结果时间。您的示例返回的日期的时间值为 11 月 4 日晚上 11 点,即 24 小时后的特定日期。原始发帖人询问了日期时间,这似乎表明对一天中正确时间的一些渴望。如果您的目标是 24 小时后的时间,则此答案是正确的。
    • 我同意诺亚,var d2 = new Date(d1.valueOf() + 24 * 60 * 60 * 1000) 照它说的做,在日期上加上一整天的刻度。跨度>
    • 这对于某些情况(例如 1 天 cookie)是绝对正确的,并且是比大多数其他情况更简单的解决方案。我不明白为什么它有这么多反对票和这么少赞成票:/
    • 同意 Matmarbon 的观点,Corey Alix 的答案更好。我实施了 Sparebytes 中排名最高的答案,但得到了错误的结果; Corey Alix 的回答奏效了
    【解决方案4】:

    试试

    var someDate = new Date();
    var duration = 2; //In Days
    someDate.setTime(someDate.getTime() +  (duration * 24 * 60 * 60 * 1000));
    

    使用 setDate() 添加日期并不能解决您的问题,请尝试在 2 月份添加一些天数,如果您尝试向其添加新天数,则不会达到您的预期。

    【讨论】:

    • 不,这不应该被标记为正确答案,因为这个解决方案假设每天有 24*60*60*1000 秒但它没有(夏令时)!
    • 有任何关于setDate() 的“二月”问题的证据吗?是不是这个:stackoverflow.com/questions/5497637/…
    • +1 这应该被标记为正确答案。我相信“夏令时”是关于 presentation 而不是关于 value,这只是毫秒数。从 value 的角度来看 - day 是 CONST 毫秒数,而在 presentation 方面可能会有所不同。
    • @disfated——这不是正确的答案。夏令时结束的那一天有 25 小时,但这种方法只增加了 24 小时,所以日期是一样的。如果使用 UTC 方法,则使用 24 小时来表示一天是可行的,但是为什么要使用 setDate 更方便呢? ;-)
    【解决方案5】:

    感谢 Jason 您按预期工作的回答,这是您的代码和 AnthonyWJones 的方便格式的混合:

    Date.prototype.addDays = function(days){
        var ms = new Date().getTime() + (86400000 * days);
        var added = new Date(ms);
        return added;
    }
    

    【讨论】:

    • 当一天的时间多于或少于 86400000 秒时不考虑夏令时,可能会导致代码出现逻辑错误(程序错误)。
    • 有时需要。 eBay API 具有基于 24 小时的 x 天拍卖,因此如果 DST 状态在拍卖中发生变化,您的物品将在不同的时间结束。在这种情况下,您需要使用此类函数来避免逻辑错误。
    【解决方案6】:

    setDate() 的 mozilla 文档并未表明它将处理月末方案。 见https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

    setDate()

    • 根据当地时间设置指定日期的月份中的第几天 (1-31)。

    这就是我在需要添加天数时使用 setTime() 的原因。

    【讨论】:

    • 我会链接到 ECMAScript 文档,但它们是以 PDF 格式发布的;(
    • 关于“setDate() 的 mozilla 文档并未表明它将处理月末方案”。 “文档”已经更新,所以现在他们这样做了。 ;-)
    【解决方案7】:

    同样的答案:How to add number of days to today's date?

        function DaysOfMonth(nYear, nMonth) {
            switch (nMonth) {
                case 0:     // January
                    return 31; break;
                case 1:     // February
                    if ((nYear % 4) == 0) {
                        return 29;
                    }
                    else {
                        return 28;
                    };
                    break;
                case 2:     // March
                    return 31; break;
                case 3:     // April
                    return 30; break;
                case 4:     // May
                    return 31; break;
                case 5:     // June
                    return 30; break;
                case 6:     // July
                    return 31; break;
                case 7:     // August
                    return 31; break;
                case 8:     // September
                    return 30; break;
                case 9:     // October
                    return 31; break;
                case 10:     // November
                    return 30; break;
                case 11:     // December
                    return 31; break;
            }
        };
    
        function SkipDate(dDate, skipDays) {
            var nYear = dDate.getFullYear();
            var nMonth = dDate.getMonth();
            var nDate = dDate.getDate();
            var remainDays = skipDays;
            var dRunDate = dDate;
    
            while (remainDays > 0) {
                remainDays_month = DaysOfMonth(nYear, nMonth) - nDate;
                if (remainDays > remainDays_month) {
                    remainDays = remainDays - remainDays_month - 1;
                    nDate = 1;
                    if (nMonth < 11) { nMonth = nMonth + 1; }
                    else {
                        nMonth = 0;
                        nYear = nYear + 1;
                    };
                }
                else {
                    nDate = nDate + remainDays;
                    remainDays = 0;
                };
                dRunDate = Date(nYear, nMonth, nDate);
            }
            return new Date(nYear, nMonth, nDate);
        };
    

    【讨论】:

    • 您需要更新您的闰年检查 - 如果年份可以被 100 整除而不是被 400 整除,则它不是闰年(2000 年是;2100 年不会)
    【解决方案8】:

    我的简单解决方案是:

    nextday=new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+1);
    

    此解决方案没有夏令时问题。此外,您可以添加/子任何年、月、日等的偏移量。

    day=new Date(oldDate.getFullYear()-2,oldDate.getMonth()+22,oldDate.getDate()+61);
    

    是正确的代码。

    【讨论】:

    • 注意:这会将时间重置为 00:00:00(可能有问题)
    • 如您所说,在任何一个月的最后一天都不起作用。使其在一年中的 12 天无法使用。调试听起来像是一场噩梦!!!
    • No Drew,一年四季都可以使用。您可以设置大于 31 的日期偏移量或大于 12 的月份偏移量,此功能将重新计算为下个月的日期或明年的月份。例如: nextday=new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+40);是非常好的代码。
    • 有 getMonth()+22 - 你认为它会起作用吗!?
    • 我同意,使用这种方式。由于夏令时,我们刚刚遇到了一个错误,因为我们使用的是setDate
    【解决方案9】:

    按照下面的主要示例,只是花了很长时间试图弄清楚交易是什么,而不是添加年份。

    如果你只想简单地在你拥有的日期上加上 n 天,你最好去:

    myDate.setDate(myDate.getDate() + n);

    或冗长的版本

    var theDate = new Date(2013, 11, 15);
    var myNewDate = new Date(theDate);
    myNewDate.setDate(myNewDate.getDate() + 30);
    console.log(myNewDate);
    

    今天/明天的事情令人困惑。通过将当前日期设置为新的日期变量,您将弄乱年份值。如果你从原来的日期开始工作,你就不会。

    【讨论】:

    • 阅读所有答案,直到我在这里找到这颗宝石。现在这是有道理的。令人惊讶的是,几乎所有答案中都复制了今天/明天的内容,但它根本没有意义,而且正如作者在最受好评的答案中所说的那样“为了可读性和清晰性”——在最受好评的评论中——,这令人困惑,是一种不好的做法和错误
    【解决方案10】:

    我昨晚创建了这些扩展:
    您可以传递正值或负值;

    示例:

    var someDate = new Date();
    var expirationDate = someDate.addDays(10);
    var previous = someDate.addDays(-5);
    
    
    Date.prototype.addDays = function (num) {
        var value = this.valueOf();
        value += 86400000 * num;
        return new Date(value);
    }
    
    Date.prototype.addSeconds = function (num) {
        var value = this.valueOf();
        value += 1000 * num;
        return new Date(value);
    }
    
    Date.prototype.addMinutes = function (num) {
        var value = this.valueOf();
        value += 60000 * num;
        return new Date(value);
    }
    
    Date.prototype.addHours = function (num) {
        var value = this.valueOf();
        value += 3600000 * num;
        return new Date(value);
    }
    
    Date.prototype.addMonths = function (num) {
        var value = new Date(this.valueOf());
    
        var mo = this.getMonth();
        var yr = this.getYear();
    
        mo = (mo + num) % 12;
        if (0 > mo) {
            yr += (this.getMonth() + num - mo - 12) / 12;
            mo += 12;
        }
        else
            yr += ((this.getMonth() + num - mo) / 12);
    
        value.setMonth(mo);
        value.setYear(yr);
        return value;
    }
    

    【讨论】:

    • .addDays() 方法不适用于跨越夏令时边界的日期。
    • 这是这里更好的答案之一,因为您(正确地)使用自 epoc 以来的毫秒数来表示日期/时间,并添加毫秒数进行调整......那你为什么不继续“addMonths”!?为什么不添加年份?你觉得无聊吗?
    • 除月份外,时间段可以用静态数字表示。但是月份可以有四种不同的长度。此外,从 Days 或更高的任何时间段长度在 DST 时都可能具有可变长度,因此您不能再使用基于时间的加法而没有另一个级别的复杂性。我添加了 addYears(),并修复了 addMonths()。
    【解决方案11】:

    正确答案

    function addDays(date, days) {
      var result = new Date(date);
      result.setDate(result.getDate() + days);
      return result;
    }
    

    错误答案

    这个答案有时提供了正确的结果,但经常返回错误的年份和月份。此答案唯一有效的时间是您添加天数的日期恰好是当前年份和月份。

    // Don't do it this way!
    function addDaysWRONG(date, days) {
      var result = new Date();
      result.setDate(date.getDate() + days);
      return result;
    }
    

    证明/示例

    Check this JsFiddle

    // Correct
    function addDays(date, days) {
        var result = new Date(date);
        result.setDate(result.getDate() + days);
        return result;
    }
    
    // Bad Year/Month
    function addDaysWRONG(date, days) {
        var result = new Date();
        result.setDate(date.getDate() + days);
        return result;
    }
    
    // Bad during DST
    function addDaysDstFail(date, days) {
        var dayms = (days * 24 * 60 * 60 * 1000);
        return new Date(date.getTime() + dayms);    
    }
    
    // TEST
    function formatDate(date) {
        return (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();
    }
    
    $('tbody tr td:first-child').each(function () {
        var $in = $(this);
        var $out = $('<td/>').insertAfter($in).addClass("answer");
        var $outFail = $('<td/>').insertAfter($out);
        var $outDstFail = $('<td/>').insertAfter($outFail);
        var date = new Date($in.text());
        var correctDate = formatDate(addDays(date, 1));
        var failDate = formatDate(addDaysWRONG(date, 1));
        var failDstDate = formatDate(addDaysDstFail(date, 1));
    
        $out.text(correctDate);
        $outFail.text(failDate);
        $outDstFail.text(failDstDate);
        $outFail.addClass(correctDate == failDate ? "right" : "wrong");
        $outDstFail.addClass(correctDate == failDstDate ? "right" : "wrong");
    });
    body {
        font-size: 14px;
    }
    
    table {
        border-collapse:collapse;
    }
    table, td, th {
        border:1px solid black;
    }
    td {
        padding: 2px;
    }
    
    .wrong {
        color: red;
    }
    .right {
        color: green;
    }
    .answer {
        font-weight: bold;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <table>
        <tbody>
            <tr>
                <th colspan="4">DST Dates</th>
            </tr>
            <tr>
                <th>Input</th>
                <th>+1 Day</th>
                <th>+1 Day Fail</th>
                <th>+1 Day DST Fail</th>
            </tr>
            <tr><td>03/10/2013</td></tr>
            <tr><td>11/03/2013</td></tr>
            <tr><td>03/09/2014</td></tr>
            <tr><td>11/02/2014</td></tr>
            <tr><td>03/08/2015</td></tr>
            <tr><td>11/01/2015</td></tr>
            <tr>
                <th colspan="4">2013</th>
            </tr>
            <tr>
                <th>Input</th>
                <th>+1 Day</th>
                <th>+1 Day Fail</th>
                <th>+1 Day DST Fail</th>
            </tr>
            <tr><td>01/01/2013</td></tr>
            <tr><td>02/01/2013</td></tr>
            <tr><td>03/01/2013</td></tr>
            <tr><td>04/01/2013</td></tr>
            <tr><td>05/01/2013</td></tr>
            <tr><td>06/01/2013</td></tr>
            <tr><td>07/01/2013</td></tr>
            <tr><td>08/01/2013</td></tr>
            <tr><td>09/01/2013</td></tr>
            <tr><td>10/01/2013</td></tr>
            <tr><td>11/01/2013</td></tr>
            <tr><td>12/01/2013</td></tr>
            <tr>
                <th colspan="4">2014</th>
            </tr>
            <tr>
                <th>Input</th>
                <th>+1 Day</th>
                <th>+1 Day Fail</th>
                <th>+1 Day DST Fail</th>
            </tr>
            <tr><td>01/01/2014</td></tr>
            <tr><td>02/01/2014</td></tr>
            <tr><td>03/01/2014</td></tr>
            <tr><td>04/01/2014</td></tr>
            <tr><td>05/01/2014</td></tr>
            <tr><td>06/01/2014</td></tr>
            <tr><td>07/01/2014</td></tr>
            <tr><td>08/01/2014</td></tr>
            <tr><td>09/01/2014</td></tr>
            <tr><td>10/01/2014</td></tr>
            <tr><td>11/01/2014</td></tr>
            <tr><td>12/01/2014</td></tr>
            <tr>
                <th colspan="4">2015</th>
            </tr>
            <tr>
                <th>Input</th>
                <th>+1 Day</th>
                <th>+1 Day Fail</th>
                <th>+1 Day DST Fail</th>
            </tr>
            <tr><td>01/01/2015</td></tr>
            <tr><td>02/01/2015</td></tr>
            <tr><td>03/01/2015</td></tr>
            <tr><td>04/01/2015</td></tr>
            <tr><td>05/01/2015</td></tr>
            <tr><td>06/01/2015</td></tr>
            <tr><td>07/01/2015</td></tr>
            <tr><td>08/01/2015</td></tr>
            <tr><td>09/01/2015</td></tr>
            <tr><td>10/01/2015</td></tr>
            <tr><td>11/01/2015</td></tr>
            <tr><td>12/01/2015</td></tr>
        </tbody>
    </table>

    【讨论】:

    • @bzlm,是的,基本相同。它只是不修改 Date 原型。我还想指出主要答案中的缺陷。
    • @bzlm:是的,我认为注释应该是“如果'开始'日期与当前日期不在同一年或月份,则此方法失败日期”。我仍然担心用户会浏览答案而不阅读警告,因为它并不突出。谢谢。
    • 我认为,即使这项工作是不正确的。 Date 没有这样的构造函数:var result = new Date(date);,参见http://www.w3schools.com/js/js_dates.asp。即使这通常有效,有时也会由于转换为字符串而导致错误的结果,反之亦然。应该是 var result = new Date(date.getTime());
    • @AnkitBalyan,查看其他答案。由于夏令时,它可能无法正常工作
    • @JimmyDillies,区别在于new Date();new Date(date)。第一个使用当前年、月和日创建;然后改变一天。第二个使用给定年、月、日创建日期,然后更改日期。
    【解决方案12】:

    我已经使用这种方法在一行中获取正确的日期,以便按照上面人们所说的时间加上一天。

    ((new Date()).setDate((new Date()).getDate()+1))
    

    我只是想我会建立一个普通的(new Date())

    (new Date()).getDate()
    > 21
    

    使用上面的代码,我现在可以在 Date() 中的 (new Date()) 中设置所有这些,并且它的行为正常。

    (new Date(((new Date()).setDate((new Date()).getDate()+1)))).getDate()
    > 22
    

    或获取Date 对象:

    (new Date(((new Date()).setDate((new Date()).getDate()+1))))
    

    【讨论】:

      【解决方案13】:

      如果可以,请使用moment.js。 JavaScript 没有很好的原生日期/时间方法。以下是 Moment 的语法示例:

      var nextWeek = moment().add(7, 'days');
      alert(nextWeek);
      &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"&gt;&lt;/script&gt;

      参考:http://momentjs.com/docs/#/manipulating/add/

      【讨论】:

      • @kpull1 提问者没有通过询问是否存在内置解决方案来限制解决方案域。
      • 现代注释:Moment.js 对于这样一个小目的而添加是难以置信。它有几百 KB,并且开箱即用对 webpack 不友好。
      • 我们首选的库是 date-fns。 Webpack 友好、快速,并将 Dates 视为不可变的。
      • @LukeWilliams 直到现在才听说过 date-fns。会检查出来。谢谢。
      • @JoshuaComeau 如果您从cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.3/moment.min.js 下载它,它会占用53​​,248 字节的磁盘空间。我想那是整个蜡球,但我不知道。无论如何,随便。这没什么大不了的。
      【解决方案14】:
          //the_day is 2013-12-31
          var the_day = Date.UTC(2013, 11, 31); 
          // Now, the_day will be "1388448000000" in UTC+8; 
          var the_next_day = new Date(the_day + 24 * 60 * 60 * 1000);
          // Now, the_next_day will be "Wed Jan 01 2014 08:00:00 GMT+0800"
      

      【讨论】:

      • 我相信这不适用于夏令时、闰秒或其他导致一天没有 86400 秒的时区变化。
      • 这是正确的。 Date.UTC 有所作为。唯一需要注意的是该月从 0 开始。
      【解决方案15】:

      我使用类似的东西:

      new Date(dateObject.getTime() + amountOfDays * 24 * 60 * 60 * 1000)
      

      适用于日节省时间:

      new Date(new Date(2014, 2, 29, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)
      

      适用于新年:

      new Date(new Date(2014, 11, 31, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)
      

      可以参数化:

      function DateAdd(source, amount, step) {
        var factor = 1;
        if (step == "day") factor = 24 * 60 * 60 * 1000;
        else if (step == "hour") factor = 60 * 60 * 1000;
        ...
        new Date(source.getTime() + amount * factor);
      }
      

      【讨论】:

        【解决方案16】:

        我总结了小时和天...

        Date.prototype.addDays = function(days){
            days = parseInt(days, 10)
            this.setDate(this.getUTCDate() + days);
            return this;
        }
        
        Date.prototype.addHours = function(hrs){
            var hr = this.getUTCHours() + parseInt(hrs  , 10);
            while(hr > 24){
              hr = hr - 24;
              this.addDays(1);
            }
        
            this.setHours(hr);
            return this;
        }
        

        【讨论】:

          【解决方案17】:

          我不敢相信,在 5 年后,此线程中还没有剪切粘贴的解决方案!
          SO:无论夏季干扰如何,都要获得相同的时间:

          Date.prototype.addDays = function(days)
              {
              var dat = new Date( this.valueOf() )
          
              var hour1 = dat.getHours()
              dat.setTime( dat.getTime() + days * 86400000) // 24*60*60*1000 = 24 hours
              var hour2 = dat.getHours()
          
              if (hour1 != hour2) // summertime occured +/- a WHOLE number of hours thank god!
                  dat.setTime( dat.getTime() + (hour1 - hour2) * 3600000) // 60*60*1000 = 1 hour
          
              return dat
          or
              this.setTime( dat.getTime() ) // to modify the object directly
              }
          

          那里。完成!

          【讨论】:

            【解决方案18】:

            派对迟到了,但是如果你使用jQuery 那么有一个很棒的插件叫做 Moment:

            http://momentjs.com/

            var myDateOfNowPlusThreeDays = moment().add(3, "days").toDate();
            

            http://momentjs.com/docs/#/manipulating/

            还有很多其他好东西!

            编辑:感谢 aikeru 的评论,删除了 jQuery 参考

            【讨论】:

            • 时刻不需要jQuery :)
            • 在这种情况下更好!
            • 是的,在用 Plain ol' JS 玩了太久之后,我使用了 Moment ,它就可以工作了(tm)!
            • 几行JS就可以了,为什么还要使用插件?
            • @frenchie 因为,从几行 JS 开始,因为很明显您的应用程序正在处理日期、日期和时间相关信息,很快就会变成 1000 行 JS,然后你系统会要求您跨 12 种语言和时区对应用进行本地化,而您希望一开始就使用类似 moment 的东西 ;)
            【解决方案19】:

            我想我也会给出答案:
            就个人而言,我喜欢尝试避免无缘无故的变量声明、方法调用和构造函数调用,因为它们的性能都很昂贵。 (当然在合理范围内)
            我本来打算在@AnthonyWJones 给出的答案下发表评论,但我想得更好。

            // Prototype usage...
            Date.prototype.addDays = Date.prototype.addDays || function( days ) {
                return this.setTime( 864E5 * days + this.valueOf() ) && this;
            };
            
            // Namespace usage...
            namespace.addDaysToDate = function( date, days ) {
                return date.setTime( 864E5 * days + date.valueOf() ) && date;
            };
            
            // Basic Function declaration...
            function addDaysToDate( date, days ) {
                return date.setTime( 864E5 * days + date.valueOf() ) && date;
            };
            

            以上将遵守夏令时。这意味着如果您添加跨 DST 的天数,显示的时间(小时)将会改变以反映这一点。
            示例:
            2014 年 11 月 2 日 02:00 是夏令时结束。

            var dt = new Date( 2014, 10, 1, 10, 30, 0 );
            console.log( dt );                  // Sat Nov 01 2014 10:30:00
            console.log( dt.addDays( 10 ) );    // Tue Nov 11 2014 09:30:00
            

            如果您希望在 DST 期间保留时间(因此 10:30 仍将是 10:30)...

            // Prototype usage...
            Date.prototype.addDays = Date.prototype.addDays || function( days ) {
                return this.setDate( this.getDate() + days ) && this;
            };
            
            // Namespace usage...
            namespace.addDaysToDate = function( date, days ) {
                return date.setDate( date.getDate() + days ) && date;
            };
            
            // Basic Function declaration...
            function addDaysToDate( date, days ) {
                return date.setDate( date.getDate() + days ) && date;
            };
            

            所以,现在你有...

            var dt = new Date( 2014, 10, 1, 10, 30, 0 );
            console.log( dt );                  // Sat Nov 01 2014 10:30:00
            console.log( dt.addDays( 10 ) );    // Tue Nov 11 2014 10:30:00
            

            【讨论】:

              【解决方案20】:

              我知道,但有时我喜欢这样:

              function addDays(days) {
                  return new Date(Date.now() + 864e5 * days);
              }
              

              【讨论】:

              • 这个对我来说最有意义。它简单、优雅,不会因数月/数年的问题而烦恼。
              • 给出了最简单的答案。在此基础上,原型“addDays”如下:Date.prototype.addDays = function(days) {return new Date(this.getTime() + (864e5 * days));};
              • 并非每一天都有 24 小时,DST 和闰秒都会失败。
              【解决方案21】:

              我正在使用以下解决方案。

              var msInDay = 86400000;
              var daysToAdd = 5;
              var now = new Date();
              var milliseconds = now.getTime();
              var newMillisecods = milliseconds + msInDay * daysToAdd;
              var newDate = new Date(newMillisecods);
              //or now.setTime(newMillisecods);
              

              Date 有一个接受 int 的构造函数。此参数表示 1970 年 1 月 1 日之前/之后的总毫秒数。它还有一个方法 setTime,它在不创建新 Date 对象的情况下执行相同的操作。

              我们在这里所做的是将天转换为毫秒,并将此值添加到 getTime 提供的值中。最后,我们将结果传递给 Date(milliseconds) 构造函数或 setTime(milliseconds) 方法。

              【讨论】:

              • 并非每一天都有 24 小时,DST 和闰秒都会失败。
              • Stephan,还有其他图书馆对此负责吗?
              • now.setDate(now.getDate() + days); 自动处理 DST 更改。而且我必须更正,闰秒在 JS 时间戳中被忽略。
              【解决方案22】:

              编辑: 而不是setTime()(或setHours())你可以这样做:

              Date.prototype.addDays= function(d){
                this.setDate(this.getDate() + d);
                return this;
              };
              
              var tomorrow = new Date().addDays(1);
              

              旧:

              您可以使用setHours(),而不是使用setTime()

              Date.prototype.addDays= function(d){
                  this.setHours(this.getHours() + d * 24);
                  return this;
              };
              
              var tomorrow = new Date().addDays(1);
              

              the JSFiddle...

              【讨论】:

              • 按照这个逻辑你也可以加一天;)d.setDate(d.getDate() + 1);
              【解决方案23】:

              对于那些使用 Angular 的人:

              只要做:

              $scope.booking.totTijd.setMinutes($scope.booking.totTijd.getMinutes()+15);
              $scope.booking.totTijd.setDate($scope.booking.totTijd.getDate() + 1);
              

              【讨论】:

                【解决方案24】:
                int days = 1;
                var newDate = new Date(Date.now() + days * 24*60*60*1000);
                

                CodePen

                var days = 2;
                var newDate = new Date(Date.now() + days * 24*60*60*1000);
                
                document.write('Today: <em>');
                document.write(new Date());
                document.write('</em><br/> New: <strong>');
                document.write(newDate);

                【讨论】:

                • 赞成不需要中间日期变量。
                • 这是最好的答案,因为它没有突变
                • 并非每一天都有 24 小时,DST 和闰秒都会失败。
                【解决方案25】:

                2.39KB 缩小。一份文件。 https://github.com/rhroyston/clock-js

                console.log(clock.what.weekday(clock.now + clock.unit.days)); //"wednesday"
                console.log(clock.what.weekday(clock.now + (clock.unit.days * 2))); //"thursday"
                console.log(clock.what.weekday(clock.now + (clock.unit.days * 3))); //"friday"
                &lt;script src="https://raw.githubusercontent.com/rhroyston/clock-js/master/clock.min.js"&gt;&lt;/script&gt;

                【讨论】:

                  【解决方案26】:

                  不,javascript 没有内置函数,但是 您可以使用简单的代码行

                  timeObject.setDate(timeObject.getDate() + countOfDays);
                  

                  【讨论】:

                    【解决方案27】:

                    最简单的解决方案。

                     Date.prototype.addDays = function(days) {
                       this.setDate(this.getDate() + parseInt(days));
                       return this;
                     };
                    
                     // and then call
                    
                     var newDate = new Date().addDays(2); //+2 days
                     console.log(newDate);
                    
                     // or
                    
                     var newDate1 = new Date().addDays(-2); //-2 days
                     console.log(newDate1);

                    【讨论】:

                    • 我认为这是最好的解决方案。如果我们要扩展 Date 类,那么 Date 实例本身会更新会更有意义。
                    【解决方案28】:

                    在 java 脚本中添加日期的非常简单的代码。

                    var d = new Date();
                    d.setDate(d.getDate() + prompt('how many days you want to add write here'));
                    alert(d);

                    【讨论】:

                      【解决方案29】:

                      我在建议的解决方案中遇到了夏令时问题。

                      通过改用getUTCDate / setUTCDate,我解决了我的问题。

                      // Curried, so that I can create helper functions like `add1Day`
                      const addDays = num => date => {
                        // Make a working copy so we don't mutate the supplied date.
                        const d = new Date(date);
                      
                        d.setUTCDate(d.getUTCDate() + num);
                      
                        return d;
                      }
                      

                      【讨论】:

                        【解决方案30】:

                        您可以在此处创建自定义帮助函数

                        function plusToDate(currentDate, unit, howMuch) {
                        
                            var config = {
                                second: 1000, // 1000 miliseconds
                                minute: 60000,
                                hour: 3600000,
                                day: 86400000,
                                week: 604800000,
                                month: 2592000000, // Assuming 30 days in a month
                                year: 31536000000 // Assuming 365 days in year
                            };
                        
                            var now = new Date(currentDate);
                        
                            return new Date(now + config[unit] * howMuch);
                        }
                        
                        var today = new Date();
                        var theDayAfterTommorow = plusToDate(today, 'day', 2);
                        

                        顺便说一句,这是添加秒、分钟或天的通用解决方案。

                        【讨论】:

                        • 即使假设一天有 86400 秒也可能是不正确的,假设没有闰年会导致严重错误。
                        • ...而且在夏令时设置的情况下,两天之间的差异并不总是 24 小时。
                        猜你喜欢
                        • 2011-01-20
                        • 1970-01-01
                        • 1970-01-01
                        • 2018-03-22
                        • 1970-01-01
                        • 1970-01-01
                        • 2023-03-06
                        • 2023-03-09
                        相关资源
                        最近更新 更多