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

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

如何将日期增加一天?


你有三个选择:

1. 仅使用JavaScript的Date对象(没有库):

我之前对第一个问题的回答是错误的(它增加了24小时,没有考虑到日光节约时间的转换;Clever Human指出,它将在东部时区的2010年11月7日失效)。相反,Jigar的答案是在没有库的情况下做到这一点的正确方法:

// 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 date对象在翻转方面很聪明:

//本地时间 var lastDayOf2015 =新的日期(2015,11,31); console.log(" 2015年最后一天:" + lastDayOf2015.toISOString()); var nextDay =新的日期(+lastDayOf2015); var dateValue = nextDay.getDate() + 1; console.log("将日期部分设置为" + dateValue "); nextDay.setDate (dateValue); console.log("结果日期:" + nextDay.toISOString());

2. 使用MomentJS:

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

(注意,add会修改调用它的实例,而不是返回一个新实例,所以今天。Add (1, 'days')将修改为今天。这就是为什么我们开始克隆var明天= ....)

3.使用DateJS,但它没有更新很长一段时间:

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

var myDate = new Date();

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

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

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,这将对你有很大帮助。


这个答案中的任何一个例子似乎都不适用于日光节约时间调整日。在这些日子里,一天的小时数不是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());

不完全确定这是否是一个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

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

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

未来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)
}

使用dateObj.toJSON()方法获取日期的字符串值参考: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);

两种方法:

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)

 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

明天在纯JS的一行,但它是丑陋的!

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

结果如下:

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

结果是表示明天日期的字符串。使用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();

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

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

另一种选择是使用矩库:

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

使用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

以防有人想增加date (day)以外的值


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);
}

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

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

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


这个方法更简单, 它会以简单的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" .

Note

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

将返回相同的结果。


使用这个函数,它解决了我的问题:

    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}`)
    }

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

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