在 JavaScript 中增加日期

IT技术 javascript date datetime
2021-01-31 18:47:03

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

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

如何将日期增加一天?

6个回答

三种方案供您选择:

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

我之前对#1 的回答是错误的(它增加了 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 日期对象在翻转方面很聪明:

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));参见规范第 15.9.2.1 节如果您想接受一系列格式,请务必查看DateJS
2021-03-13 18:47:03
(继续)问题是查看 UTC 本地时间的变化。本地应视为本地,更改为本地;UTC 应视为 UTC 并更改为 UTC。所以这个作品在本地时间(我用16:00太平洋,但将其更改为匹配您的时区,尽管小时无所谓):d = new Date(2016, 3 - 1, 13, 16), d.setDate(d.getDate()+1), d.toString()这作品UTC(通过getUTCDate/ setUTCDated = new Date("2016-03-13T00:00:00.000Z"), d.setUTCDate(d.getUTCDate()+1), d.toISOString()感谢您指出了这一点!我已经更新了答案以提及它。
2021-03-20 18:47:03
@piavgh:第一个解决方案没有任何问题,只是您如何使用它。Date对象是可变的。在数组中存储了三次相同的 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)); }
2021-03-23 18:47:03
@santanu:只是为了跟进上述内容:某些浏览器可能会成功解析该格式Date.parse(返回的毫秒数,然后您可以输入new Date(ms))。但请注意,这可能因浏览器而异。直到最近,实现还可以做任何他们想做的事情Date.parse新的第 5 版规范现在有一个必须接受的最低格式,但我还不会指望它。
2021-03-26 18:47:03
我只是想为 Date 实例添加一秒钟;这对我有用x = new Date(); x2 = new Date(x.getTime() + 1000),其中 1000 是毫秒增量。
2021-03-31 18:47:03
var myDate = new Date();

//add a day to the date
myDate.setDate(myDate.getDate() + 1);
不适用于 2016-03-13: d = new Date("2016-03-13T00:00:00.000Z"), d.setDate(d.getDate()+1), d.toISOString()
2021-03-21 18:47:03
不是更换了更坚实的方式-/和希望,浏览器会接受它,将是划分串入部分: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月份是枚举值(因为1月份是0,没有1),以及d+1因为我们'在初始分配中已经在进行增量(它会在 2 月 29 日等自动更正)
2021-03-22 18:47:03
@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);.
2021-03-25 18:47:03
但是我通过使用 document.getElementById("arrival_date").value 在一个变量中有日期 2010-09-11,它显示无效日期
2021-04-03 18:47:03

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

var tomorrow = new Date(today.getTime()+1000*60*60*24);
这是最好的答案。可以根据要求轻松增加/减少天数;只需乘以1000*60*60*24xDaysToBeAdded
2021-03-20 18:47:03
除非您的日期是 UTC 或其他没有夏令时的时区,否则不要这样做。否则,每年2天,就会产生意想不到的结果。
2021-03-20 18:47:03
单线: new Date(Date.now()+1000*60*60*24);
2021-03-30 18:47:03
或者,new Date(+new Date() + 1000*60*60*24),但它实际上类似于getTime()/ setTime(),真的。
2021-03-31 18:47:03
我喜欢这个,整数表示规则。
2021-04-05 18:47:03

明天在纯 JS 中一行,但它很丑

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

结果如下:

Thu Oct 12 2017 08:53:30 GMT+0200 (Romance Summer Time)
不适用于 2016-03-13: d = new Date("2016-03-13T00:00:00.000Z"), d.setDate(d.getDate()+1), d.toISOString()
2021-03-18 18:47:03
@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"所以一切都很好。
2021-03-19 18:47:03
一行正是我需要的 Vue.js 表达式,因为我不得不删除一个参数,而且没有地方可以设置和输入几行。谢谢!
2021-04-05 18:47:03

此答案中的所有示例似乎都不适用于夏令时调整日。在那些日子里,一天中的小时数不是 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());