【问题标题】:Incrementing a date in JavaScript在 JavaScript 中增加日期
【发布时间】:2011-04-10 03:02:37
【问题描述】:

我需要在 JavaScript 中将日期值增加一天。

例如,我有一个日期值 2010-09-11,我需要将第二天的日期存储在 JavaScript 变量中。

如何将日期增加一天?

【问题讨论】:

标签: javascript date datetime


【解决方案1】:

三种选择:

1。仅使用 JavaScript 的 Date 对象(无库):

我之前对#1 的回答是错误的(它增加了 24 小时,没有考虑到夏令时的转换;Clever Human 指出它会在东部时区的 2010 年 11 月 7 日失败)。相反,Jigar's answer 是在没有库的情况下执行此操作的正确方法:

// To do it in local time
var tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);

// To do it in UTC
var tomorrow = new Date();
tomorrow.setUTCDate(tomorrow.getUTCDate() + 1);

这甚至适用于一个月(或一年)的最后一天,因为 JavaScript 日期对象在翻转方面很聪明:

// (local time)
var lastDayOf2015 = new Date(2015, 11, 31);
console.log("Last day of 2015: " + lastDayOf2015.toISOString());
var nextDay = new Date(+lastDayOf2015);
var dateValue = nextDay.getDate() + 1;
console.log("Setting the 'date' part to " + dateValue);
nextDay.setDate(dateValue);
console.log("Resulting date: " + nextDay.toISOString());

2。使用MomentJS:

var today = moment();
var tomorrow = moment(today).add(1, 'days');

(注意add 会修改您调用它的实例,而不是返回一个新实例,因此today.add(1, 'days') 会修改today。这就是我们从var tomorrow = ... 上的克隆操作开始的原因。)

3。使用DateJS,但是很久没更新了:

var today = new Date(); // Or Date.today()
var tomorrow = today.add(1).day();

【讨论】:

  • @santanu:这是一个完全不同的问题:日期解析(通过解释字符串来获取日期)。如果该格式是静态的,您可以自己解析它并将结果输入Date 构造函数(new Date(year, month, date));请参阅specification 的第 15.9.2.1 节;如果您想接受一系列格式,请务必查看DateJS
  • @santanu:只是继续上面的内容:一些浏览器可能会成功地使用Date.parse 解析该格式(它会返回毫秒数,然后您可以将其输入new Date(ms))。但请注意,这可能因浏览器而异。直到最近,实现可以在Date.parse 中做任何他们想做的事情。新的第 5 版规范现在有一个必须接受的最低格式,但我还不能指望它。
  • 我只是想在 Date 实例中添加一秒;这对我有用x = new Date(); x2 = new Date(x.getTime() + 1000),其中 1000 是毫秒增量。
  • @piavgh:第一个解决方案没有任何问题,这只是您使用它的方式。 Date 对象是可变的。您将 same Date 对象在数组中存储了三次。如果你想要三个不同的Date 对象,你必须创建三个对象:var unavailableDates = []; for (var d = new Date('2017-05-11'); d < new Date('2017-05-13'); d.setDate(d.getDate() + 1)) { unavailableDates.push(new Date(+d)); }
  • (继续) 问题在于查看 UTC 中本地时间的变化。本地应视为本地,更改为本地; UTC 应被视为 UTC 并更改为 UTC。所以这适用于当地时间(我使用 16:00 表示太平洋,但将其更改为与您的时区匹配,尽管时间无关紧要):d = new Date(2016, 3 - 1, 13, 16), d.setDate(d.getDate()+1), d.toString() 这适用于 UTC(通过 getUTCDate/setUTCDate ):d = new Date("2016-03-13T00:00:00.000Z"), d.setUTCDate(d.getUTCDate()+1), d.toISOString()。感谢您指出了这一点!我已经更新了答案以提及它。
【解决方案2】:
var myDate = new Date();

//add a day to the date
myDate.setDate(myDate.getDate() + 1);

【讨论】:

  • 但是我使用 document.getElementById("arrival_date").value 在变量中有日期 2010-09-11,它显示无效日期
  • @sanatu:在这种情况下,您需要以浏览器可以接受的方式格式化字符串。 Chrome 接受new Date("2009-09-11"),但 Firefox 不接受。我认为大多数浏览器都接受new Date("2009/09/11"),所以一个简单的解决方案是var arrivalDate = document.getElementById('arival_date').value; var dayAfter = new Date(arrival_date.replace(/-/g, '/')); dayAfter.setDate(dayAfter.getDate()+1);
  • 比将- 替换为/ 并希望浏览器接受它更可靠的方法是将字符串分成几部分:var dateParts = arrivalDate.split('-'); var y = parseInt(dateParts[0], 10); var m = parseInt(dateParts[1], 10); var d = parseInt(dateParts[2], 10); var dayAfter = new Date(y, m-1, d+1); 请注意,我们使用的是m-1在这里,因为 javascript 月份是枚举值(一月是 0,而不是 1),而 d+1 因为我们已经在初始分配中进行了增量(它会在 2 月 29 日自动更正,等等)
  • 不适用于 2016-03-13:d = new Date("2016-03-13T00:00:00.000Z"), d.setDate(d.getDate()+1), d.toISOString()
【解决方案3】:

在遵循其他人的建议之前,您首先需要解析您的字符串:

var dateString = "2010-09-11";
var myDate = new Date(dateString);

//add a day to the date
myDate.setDate(myDate.getDate() + 1);

如果您希望它再次以相同的格式返回,则必须“手动”执行此操作:

var y = myDate.getFullYear(),
    m = myDate.getMonth() + 1, // january is month 0 in javascript
    d = myDate.getDate();
var pad = function(val) { var str = val.toString(); return (str.length < 2) ? "0" + str : str};
dateString = [y, pad(m), pad(d)].join("-");

但我建议像其他回复中提到的那样获取 Date.js,这将对您有所帮助alot

【讨论】:

    【解决方案4】:

    此答案中的示例似乎都不适用于夏令时调整日。在那些日子里,一天中的小时数不是 24 小时(它们是 23 或 25,取决于你是“向前跳”还是“向后跳”。)

    下面的 AddDays javascript 函数考虑了夏令时:

    function addDays(date, amount) {
      var tzOff = date.getTimezoneOffset() * 60 * 1000,
          t = date.getTime(),
          d = new Date(),
          tzOff2;
    
      t += (1000 * 60 * 60 * 24) * amount;
      d.setTime(t);
    
      tzOff2 = d.getTimezoneOffset() * 60 * 1000;
      if (tzOff != tzOff2) {
        var diff = tzOff2 - tzOff;
        t += diff;
        d.setTime(t);
      }
    
      return d;
    }
    

    这是我用来测试功能的测试:

        var d = new Date(2010,10,7);
        var d2 = AddDays(d, 1);
        document.write(d.toString() + "<br />" + d2.toString());
    
        d = new Date(2010,10,8);
        d2 = AddDays(d, -1)
        document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());
    
        d = new Date('Sun Mar 27 2011 01:59:00 GMT+0100 (CET)');
        d2 = AddDays(d, 1)
        document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());
    
        d = new Date('Sun Mar 28 2011 01:59:00 GMT+0100 (CET)');
        d2 = AddDays(d, -1)
        document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());
    

    【讨论】:

      【解决方案5】:

      不完全确定它是否是一个 BUG(经过测试的 Firefox 32.0.3 和 Chrome 38.0.2125.101),但以下代码在巴西(-3 GMT)上会失败:

      Date.prototype.shiftDays = function(days){    
        days = parseInt(days, 10);
        this.setDate(this.getDate() + days);
        return this;
      }
      
      $date = new Date(2014, 9, 16,0,1,1);
      $date.shiftDays(1);
      console.log($date+"");
      $date.shiftDays(1);
      console.log($date+"");
      $date.shiftDays(1);
      console.log($date+"");
      $date.shiftDays(1);
      console.log($date+"");
      

      结果:

      Fri Oct 17 2014 00:01:01 GMT-0300
      Sat Oct 18 2014 00:01:01 GMT-0300
      Sat Oct 18 2014 23:01:01 GMT-0300
      Sun Oct 19 2014 23:01:01 GMT-0200
      

      在日期上增加一小时,将使其完美运行(但不能解决问题)。

      $date = new Date(2014, 9, 16,0,1,1);
      

      结果:

      Fri Oct 17 2014 01:01:01 GMT-0300
      Sat Oct 18 2014 01:01:01 GMT-0300
      Sun Oct 19 2014 01:01:01 GMT-0200
      Mon Oct 20 2014 01:01:01 GMT-0200
      

      【讨论】:

        【解决方案6】:

        最简单的方法是转换为毫秒并加上 1000*60*60*24 毫秒例如:

        var tomorrow = new Date(today.getTime()+1000*60*60*24);
        

        【讨论】:

        • 我喜欢这个,整数表示规则。
        • 这是最好的答案。可以根据要求轻松增加/减少天数;只需乘以1000*60*60*24 x DaysToBeAdded
        • 或者,new Date(+new Date() + 1000*60*60*24),其实和getTime()/setTime()很像,真的。
        • 除非您的日期是 UTC 或其他没有夏令时的时区,否则不要这样做。否则,每年 2 天,它会产生意想不到的结果。
        • 单行:new Date(Date.now()+1000*60*60*24);
        【解决方案7】:

        接下来的 5 天:

        var date = new Date(),
        d = date.getDate(),
        m = date.getMonth(),
        y = date.getFullYear();
        
        
        for(i=0; i < 5; i++){
        var curdate = new Date(y, m, d+i)
        console.log(curdate)
        }
        

        【讨论】:

        • 尝试了上述答案,但徒劳无功。你的代码就像一个魅力。谢谢!
        【解决方案8】:

        使用 dateObj.toJSON() 方法获取日期的字符串值 Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON 从返回的值中切出日期,然后按所需的天数递增。

        var currentdate = new Date();
        currentdate.setDate(currentdate.getDate() + 1);
        var tomorrow = currentdate.toJSON().slice(0,10);
        

        【讨论】:

        【解决方案9】:

        两种方法:

        1:

        var a = new Date()
        // no_of_days is an integer value
        var b = new Date(a.setTime(a.getTime() + no_of_days * 86400000)
        

        2:和上一个方法类似

        var a = new Date()
        // no_of_days is an integer value
        var b = new Date(a.setDate(a.getDate() + no_of_days)
        

        【讨论】:

          【解决方案10】:
           Date.prototype.AddDays = function (days) {
              days = parseInt(days, 10);
              return new Date(this.valueOf() + 1000 * 60 * 60 * 24 * days);
          }
          

          例子

          var dt = new Date();
          console.log(dt.AddDays(-30));
          console.log(dt.AddDays(-10));
          console.log(dt.AddDays(-1));
          console.log(dt.AddDays(0));
          console.log(dt.AddDays(1));
          console.log(dt.AddDays(10));
          console.log(dt.AddDays(30));
          

          结果

          2017-09-03T15:01:37.213Z
          2017-09-23T15:01:37.213Z
          2017-10-02T15:01:37.213Z
          2017-10-03T15:01:37.213Z
          2017-10-04T15:01:37.213Z
          2017-10-13T15:01:37.213Z
          2017-11-02T15:01:37.213Z
          

          【讨论】:

          • 您的代码不起作用。我已经用第一个 console.log() 试过了,它说:dt.AddDays() 不是一个函数。
          【解决方案11】:

          明天在纯 JS 中的一行但是它是

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

          结果如下:

          Thu Oct 12 2017 08:53:30 GMT+0200 (Romance Summer Time)
          

          【讨论】:

          • 这一行正是我需要的 Vue.js 表达式,因为我必须删除一个参数并且没有地方可以设置和获取几行。谢谢!
          • 不适用于 2016-03-13:d = new Date("2016-03-13T00:00:00.000Z"), d.setDate(d.getDate()+1), d.toISOString()
          • @Azmisov 刚刚再次为您检查。 d = new Date("2016-03-13T00:00:00.000Z"); 在我的记忆中:Sun Mar 13 2016 01:00:00 GMT+0100 (Central European Standard Time)。然后我做d.setDate(d.getDate()+1),在记忆中我有1457913600000或漂亮的打印Mon Mar 14 2016 01:00:00 GMT+0100 (Central European Standard Time)。最后 d.toISOString() 给了我 13 -> 14 后的第二天:"2016-03-14T00:00:00.000Z"。所以一切都很好。
          【解决方案12】:

          以字符串表示明天的日期。使用 new Date() 获取今天的日期,使用 Date.getDate() 和 Date.setDate() 加一天,并将 Date 对象转换为字符串。

            const tomorrow = () => {
                let t = new Date();
                t.setDate(t.getDate() + 1);
                return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(
                  t.getDate()
                ).padStart(2, '0')}`;
              };
              tomorrow();
          

          【讨论】:

            【解决方案13】:

            通过原生JS,添加一天你可以做以下:

            let date = new Date(); // today
            date.setDate(date.getDate() + 1) // tomorrow
            

            另一种选择是使用moment 库:

            const date = moment().add(14, "days").toDate()
            

            【讨论】:

            • 请解释一下这段代码的作用。添加有关它如何解决 OP 问题的详细信息。
            【解决方案14】:

            使用 vanilla js 递增日期的年份:

            start_date_value = "01/01/2019"
            var next_year = new Date(start_date_value);
            next_year.setYear(next_year.getYear() + 1);
            console.log(next_year.getYear()); //=> 2020
            

            以防万一有人想增加日期(天)以外的其他值

            【讨论】:

              【解决方案15】:

              JavaScript 日期的时区/夏令时感知日期增量:

              function nextDay(date) {
                  const sign = v => (v < 0 ? -1 : +1);
                  const result = new Date(date.getTime());
                  result.setDate(result.getDate() + 1);
                  const offset = result.getTimezoneOffset();
                  return new Date(result.getTime() + sign(offset) * offset * 60 * 1000);
              }
              

              【讨论】:

                【解决方案16】:

                我觉得没有什么比.getTime().setTime() 更安全了,所以这应该是最好的,而且性能也很好。

                const d = new Date()
                console.log(d.setTime(d.getTime() + 1000 * 60 * 60 * 24)) // MILLISECONDS
                

                .setDate() 无效日期(如 31 + 1)太危险了,这取决于浏览器的实现。

                【讨论】:

                  【解决方案17】:

                  这是一个更简单的方法, 它会以简单的 yyyy-mm-dd 格式返回日期,这里是

                  function incDay(date, n) {
                      var fudate = new Date(new Date(date).setDate(new Date(date).getDate() + n));
                      fudate = fudate.getFullYear() + '-' + (fudate.getMonth() + 1) + '-' + fudate.toDateString().substring(8, 10);
                      return fudate;
                  }
                  
                  

                  示例:

                  var tomorrow = incDay(new Date(), 1); // the next day of today , aka tomorrow :) .
                  var spicaldate = incDay("2020-11-12", 1); // return "2020-11-13" .
                  var somedate = incDay("2020-10-28", 5); // return "2020-11-02" .
                  

                  注意

                  incDay(new Date("2020-11-12"), 1); 
                  incDay("2020-11-12", 1); 
                  

                  将返回相同的结果。

                  【讨论】:

                    【解决方案18】:

                    使用这个功能,它解决了我的问题:

                        let nextDate = (daysAhead:number) => {
                          const today = new Date().toLocaleDateString().split('/')
                          const invalidDate = new Date(`${today[2]}/${today[1]}/${Number(today[0])+daysAhead}`)
                          if(Number(today[1]) === Number(12)){
                            return new Date(`${Number(today[2])+1}/${1}/${1}`)
                          }
                          if(String(invalidDate) === 'Invalid Date'){
                            return new Date(`${today[2]}/${Number(today[1])+1}/${1}`)
                          }
                            return new Date(`${today[2]}/${Number(today[1])}/${Number(today[0])+daysAhead}`)
                        }
                    

                    【讨论】:

                      【解决方案19】:

                      将当前日期的增量分配给其他变量

                       let startDate=new Date();
                       let endDate=new Date();    
                       endDate.setDate(startDate.getDate() + 1)
                       console.log(startDate,endDate)
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2019-03-28
                        • 2019-05-18
                        • 2013-06-17
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多