【问题标题】:How to add days to Date?如何将日期添加到日期?
【发布时间】:2010-10-08 11:36:18
【问题描述】:

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

【问题讨论】:

    标签: javascript date


    【解决方案1】:

    你可以创建一个:-

    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 在夏季将那个小时加回去以标准化时间。但只有在使用绝对小时时——不需要解释相对小时。这就是日期数学有效的原因。恕我直言...
    【解决方案2】:

    正确答案

    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)。第一个使用当前年、月和日创建;然后改变一天。第二个使用给定年、月、日创建日期,然后更改日期。
    【解决方案3】:
    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 年。
    【解决方案4】:

    我的简单解决方案是:

    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
    【解决方案5】:

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

    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)是绝对正确的,并且是比大多数其他情况更简单的解决方案。我不明白为什么它有这么多反对票和这么少赞成票:/
    • 当(且仅当)您的日期代表 UTC 日期/时间或者您只想添加 24 小时制时,此答案是正确的。当(且仅当)您的日期代表当地时间时,其他一些答案(AnthonyWJones 的)是正确的。要理解的是,JavaScript Date 代表一个绝对的时间点,并且它们没有时区,因此您必须根据您知道(在您的脑海中)日期代表的时区选择正确的方法来使用.
    【解决方案6】:

    试试

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

    这是用于在 Javascript 中为特定日期添加日、月和年的方法。

    // To add Days
    var d = new Date();
    d.setDate(d.getDate() + 5);
    
    // To add Months
    var m = new Date();
    m.setMonth(m.getMonth() + 5);
    
    // To add Years
    var y = new Date();
    y.setFullYear(y.getFullYear() + 5);
    

    【讨论】:

      【解决方案8】:

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

      如果你只想简单地在你拥有的日期上加上 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);
      

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

      【讨论】:

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

      我实现的最简单的方法是使用 Date() 本身。 `

      const days = 15; 
      // Date.now() gives the epoch date value (in milliseconds) of current date 
      nextDate = new Date( Date.now() + days * 24 * 60 * 60 * 1000)
      

      `

      【讨论】:

      • 如果你关心 DST,你应该使用 NicoESIEA 的答案(你应该这样做)
      • 到目前为止,这是解决该问题的最优雅的解决方案,因为它处理了将日期设置为超出月份的恶劣情况这一事实。您可以从字面上正确地使用...函数 addTime(years,month,day) 之类的函数。如果你想对它发疯,你可以添加小时、分钟、秒和毫秒。我以前在 Unity 中经常这样做来跟踪游戏中的时间,因为它使用了 Epoch 方法。
      【解决方案10】:
      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 和闰秒都会失败。
      【解决方案11】:

      如果可以,请使用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 字节的磁盘空间。我想那是整个蜡球,但我不知道。无论如何,随便。这没什么大不了的。
      【解决方案12】:

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

      示例:

      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()。
      【解决方案13】:

      专为pipeline operator设计的解决方案:

      const addDays = days => date => {
        const result = new Date(date);
      
        result.setDate(result.getDate() + days);
      
        return result;
      };
      

      用法:

      // Without the pipeline operator...
      addDays(7)(new Date());
      
      // And with the pipeline operator...
      new Date() |> addDays(7);
      

      如果您需要更多功能,我建议您查看date-fns 库。

      【讨论】:

        【解决方案14】:

        最简单的答案是,假设需要在当前日期上加 1 天:

        var currentDate = new Date();
        var numberOfDayToAdd = 1;
        currentDate.setDate(currentDate.getDate() + numberOfDayToAdd );
        

        逐行解释这段代码的作用:

        1. 创建名为 currentDate 的 当前日期 变量。默认情况下,“new Date()”会自动将当前日期分配给变量。
        2. 创建一个变量来保存要添加的天数到日期(您可以跳过此变量,直接使用第三行中的值)
        3. 更改 Date 的值(因为 Date 是保存在对象中的月份的天数),方法是提供相同的值 + 您想要的数字。自动切换到下个月

        【讨论】:

          【解决方案15】:

          不使用第二个变量,您可以将 7 替换为接下来的 x 天:

          let d=new Date(new Date().getTime() + (7 * 24 * 60 * 60 * 1000));
          

          【讨论】:

            【解决方案16】:

            减去 30 天的使用时间(24h=86400000ms)

            new Date(+yourDate - 30 *86400000)
            

            var yourDate=new Date();
            var d = new Date(+yourDate - 30 *86400000) 
            
            console.log(d)

            【讨论】:

            【解决方案17】:

            最简单的解决方案。

             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 实例本身会更新会更有意义。
            【解决方案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】:

            你可以使用 JavaScript,不需要 jQuery:

            var someDate = new Date();
            var numberOfDaysToAdd = 6;
            someDate.setDate(someDate.getDate() + numberOfDaysToAdd); 
            Formatting to dd/mm/yyyy :
            
            var dd = someDate.getDate();
            var mm = someDate.getMonth() + 1;
            var y = someDate.getFullYear();
            
            var someFormattedDate = dd + '/'+ mm + '/'+ y;
            

            【讨论】:

            • 愿意为此投票,因为这个答案给出了正确的月份,因为 date.getMonth() 的范围从 0 到 11,并且需要按照这个解决方案中的说明增加 1。
            【解决方案20】:

            就这么简单:

            new Date((new Date()).getTime() + (60*60*24*1000));
            

            【讨论】:

            • 虽然这确实增加了 UTC 天数,但它使用本地方法并且不允许本地天数不是 24 小时长,当时区偏移发生变化时会发生这种情况(例如进入和退出夏令时)。
            【解决方案21】:

            感谢 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 状态在拍卖中发生变化,您的物品将在不同的时间结束。在这种情况下,您需要使用此类函数来避免逻辑错误。
            【解决方案22】:

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

            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 和闰秒都会失败。
            【解决方案23】:

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

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

            【讨论】:

              【解决方案24】:

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

              通过改用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;
              }
              

              【讨论】:

                【解决方案25】:

                为什么这么复杂?

                假设您将要添加的天数存储在名为 days_to_add 的变量中。

                那么这个简短的应该做到这一点:

                calc_date = new Date(Date.now() +(days_to_add * 86400000));
                

                使用 Date.now() 您可以得到实际的 unix 时间戳,以毫秒为单位,然后您可以添加任意多的毫秒数,以添加天数。 一天是 24h60min60s*1000ms = 86400000 ms 或 864E5。

                【讨论】:

                • 这行得通!而且实际上很聪明,而且很短。我测试看看,如果你添加 30 天或 45 天,它是否计算正确并跳过正确的月份,并且似乎没问题。这样做的方式是我一直在寻找的,并且使用“开箱即用”的 js 日期函数是可行的方法,而不是使它复杂化,只需使用已经存在的东西!竖起大拇指!谢谢!
                【解决方案26】:

                没有变量的通用原型,它适用于现有的 Date 值:

                Date.prototype.addDays = function (days) {
                    return new Date(this.valueOf() + days * 864e5);
                }
                

                【讨论】:

                  【解决方案27】:

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

                  setDate()

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

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

                  【讨论】:

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

                  我想我也会给出答案:
                  就个人而言,我喜欢尝试避免无缘无故的变量声明、方法调用和构造函数调用,因为它们的性能都很昂贵。 (当然在合理范围内)
                  我本来打算在@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
                  

                  【讨论】:

                    【解决方案29】:

                    短:

                    function addDays(date, number) {
                        const newDate = new Date(date);
                        return new Date(newDate.setDate(newDate.getDate() + number));
                    }
                    
                    console.log({
                        tomorrow: addDays(new Date(), 1)
                    });
                    
                    

                    前进:

                    
                    function addDays(date, number) {
                        const newDate = new Date(date);
                        return new Date(newDate.setDate(date.getDate() + number));
                    }
                    
                    function addMonths(date, number) {
                        const newDate = new Date(date);
                        return new Date(newDate.setMonth(newDate.getMonth() + number));
                    }
                    
                    function addYears(date, number) {
                        const newDate = new Date(date);
                        return new Date(newDate.setFullYear(newDate.getFullYear() + number));
                    }
                    
                    function getNewDate(dateTime) {
                        let date = new Date();
                        let number = parseInt(dateTime.match(/\d+/)[0]);
                    
                        if (dateTime.indexOf('-') != -1)
                            number = (- number);
                    
                    
                        if (dateTime.indexOf('day') != -1)
                            date = addDays(date, number);
                    
                        else if (dateTime.indexOf('month') != -1)
                            date = addMonths(date, number);
                    
                        else if (dateTime.indexOf('year') != -1)
                            date = addYears(date, number);
                    
                    
                        return date;
                    }
                    
                    
                    console.log({
                        tomorrow: getNewDate('+1day'),
                        yesterday: getNewDate('-1day'),
                        nextMonth: getNewDate('+1month'),
                        nextYear: getNewDate('+1year'),
                    });
                    

                    jperl提供修复

                    【讨论】:

                    • 但是,这将修改您传递给函数的日期对象。如果你这样做addDays(today, 1),今天就是明天。 function addDays(date, number) { const newDate = new Date(date) return new Date(newDate.setDate(newDate.getDate() + number)); }
                    【解决方案30】:

                    你可以试试:

                    var days = 50;
                    
                    const d = new Date();
                    
                    d.setDate(d.getDate() + days)
                    

                    这应该很好用。

                    【讨论】:

                    • 我赞成这一点,但真正的一个衬线是 new Date( (new Date()).setDate((new Date()).getDate() + 1) )
                    猜你喜欢
                    • 2014-01-26
                    • 2023-03-08
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-11-28
                    相关资源
                    最近更新 更多