向 JavaScript 日期添加天数

IT技术 javascript date datetime time
2020-12-15 16:22:47

如何Date使用 JavaScript添加当前天数JavaScript 有像 .Net 那样的内置函数AddDay吗?

6个回答

您可以使用以下方法创建一个:-

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);};
2021-02-13 16:22:47
伙计们,不要使用添加 864E5 的方法,因为这不考虑夏令时差异,天可以是 23 或 25 小时。
2021-02-15 16:22:47
@Duncan 你确定这和上面的一样吗?这个简单地增加了 24 小时,但一天并不总是 24 小时我想问题是如何在不更改时间部分的情况下将日期部分增加 1 天。
2021-02-21 16:22:47
864E5出于某种原因,我更喜欢24*60*60在我的代码中编写:)
2021-02-22 16:22:47
对于那些担心夏令时的人——别担心。这些算法改变了基础日期,而不是如何解释日期。DST 是在日期的 getter 和 setter 中实现的——getter 在夏天减去一个小时,setter 在夏天添加那个小时以规范时间。但仅当使用绝对小时数时——不需要解释相对小时数。这就是日期数学起作用的原因。恕我直言...
2021-02-24 16:22:47

正确答案

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

证明/例子

检查这个 JsFiddle

我认为,即使这项工作也不正确。Date 没有这样的构造函数:var result = new Date(date); ,见http://www.w3schools.com/js/js_dates.asp即使这通常有效,有时也会由于转换为字符串而导致错误的结果,反之亦然。它应该是var result = new Date(date.getTime());
2021-02-19 16:22:47
@AnkitBalyan,请参阅其他答案。由于夏令时,它可能无法正常工作
2021-02-20 16:22:47
@JimmyDillies,区别在于new Date();vs new Date(date)第一个创建当前的年、月和日;然后改变一天。第二个创建具有给定年、月、日的日期,然后更改日期。
2021-02-27 16:22:47
@bzlm,是的,基本相同。它只是不修改 Date 原型。我还想指出主要答案中的缺陷。
2021-03-06 16:22:47
@bzlm:是的,我相信注释应该是“如果‘起始’日期当前日期不在同一年同一,则此方法将失败”。我仍然担心用户会浏览答案而不会阅读警告,因为它并不突出。谢谢。
2021-03-09 16:22:47
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);

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

@sims 月份为 0 索引。第三个月是四月
2021-02-18 16:22:47
为什么需要创建 2 个单独的日期对象?为什么不简单地使用相同的日期对象:var d = new Date(); d.setDate( d.getDate() + 1 );
2021-02-27 16:22:47
是的?但这是什么?(2010 年 3 月 31 日运行):今天 = new Date(); 明天 = 新日期();明天.setDate(today.getDate()+1); 警报(tomorrow.getMonth());说“3”。警报(明天);是对的……为什么???
2021-03-02 16:22:47
@DrewNoakes——你断言它不能跨年工作是错误的。getDate返回月份中的日期,而不是“那一年的日期”。例如var d = new Date(2015,11,30);d.setDate(d.getDate() + 370),2017 年 1 月 3 日跨越 2 年。
2021-03-06 16:22:47
这种方法并不适用于多年。如果您的开始日期是几年前,则getDate()返回当年的日期然后,调用setDate设置当前年份中的日期所以这不是一个好的通用解决方案。@AnthonyWJones 的回答实际上是正确的。
2021-03-08 16:22:47

我的简单解决方案是:

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

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

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

是正确的代码。

我同意,使用这种方式。由于夏令时,我们遇到了一个错误,因为我们正在使用setDate.
2021-02-17 16:22:47
没有德鲁,一年四季都可以使用。您可以设置大于 31 的日期偏移或大于 12 的月份偏移,此函数会将其重新计算为下个月的天或下一年的月份。例如: nextday=new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+40); 是非常好的代码。
2021-02-26 16:22:47
注意:这会将时间重置为 00:00:00(可能是一个问题,也可能不是)
2021-03-05 16:22:47
有 getMonth()+22 - 你认为它会起作用!?
2021-03-05 16:22:47
正如您所说,在任何一个月的最后一天都不起作用。使其在一年中的 12 天无法使用。听起来像是调试的噩梦!!!
2021-03-07 16:22:47

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

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

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

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

同意 Matmarbon 的观点,Corey Alix 的回答更好。我实现了 Sparebytes 中排名最高的答案,但得到了错误的结果;Corey Alix 的回答有效
2021-02-14 16:22:47
这对于某些情况(例如 1 天 cookie)是绝对正确的,并且是比大多数其他情况更简单的解决方案。我不明白为什么它有这么多反对票和这么少赞成票:/
2021-02-16 16:22:47
此解决方案不考虑夏令时。因此,例如,这将在 23 小时后返回相同的日期: new Date(new Date('11/4/2012').getTime() + 86400000)
2021-03-01 16:22:47
我同意 Noah, var d2 = new Date(d1.valueOf() + 24 * 60 * 60 * 1000) 做它所说的,为日期添加一整天的刻度。
2021-03-05 16:22:47
@NoahMiller 您提出的问题可能是功能而不是错误!每天增加 24 小时有时是正确的做法,目的是根据 DST 了解结果时间。您的示例返回的日期的时间值为 11 月 4 日晚上 11 点,也就是 24 小时后的那个特定日期。最初的海报询问日期时间,这似乎表明对一天中的正确时间有些渴望。如果您的目标是 24 小时后的时间,则此答案是正确的。
2021-03-07 16:22:47