ChatGPT解决这个技术问题 Extra ChatGPT

如何将日期添加到日期?

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


D
Daniel A. White

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

Date.prototype.addDays = function(days) { var date = new Date(this.valueOf()); date.setDate(date.getDate() + days);归期; } 变种日期 = 新日期(); 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 在夏季将那个小时加回去以标准化时间。但只有在使用绝对小时时——不需要解释相对小时。这就是日期数学有效的原因。恕我直言...
s
sparebytes

正确答案:

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

// 正确 function addDays(date, days) { var result = new Date(date); result.setDate(result.getDate() + days);返回结果; } // 坏年/月 function addDaysWRONG(date, days) { var result = new Date(); result.setDate(date.getDate() + days);返回结果; } // 夏令时期间出错 function addDaysDstFail(date, days) { var dayms = (days * 24 * 60 * 60 * 1000);返回新日期(日期.getTime()+天); } // 测试函数 formatDate(date) { return (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear(); } $('tbody tr td:first-child').each(function () { var $in = $(this); var $out = $('').insertAfter($in).addClass ("answer"); var $outFail = $('').insertAfter($out); var $outDstFail = $('').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 ? "正确" : "错误"); });正文 { 字体大小:14px; } 表 { 边框折叠:折叠; } table, td, th { 边框:1px 纯黑色; } td { 填充:2px; } .wrong { 颜色:红色; } .right { 颜色:绿色; } .answer { 字体粗细:粗体; }

< th>输入< td>09/01/2013< /tr> th> < td>11/01/2014
夏令时日期
输入 +1天 +1天失败 + 1 天 DST 失败
03/10/2013
11/03/2013
03/09/2014
11/02/2014
03/08/2015< /td>
11/01/2015
2013
+1 天 +1 天失败 +1 天夏令时失败
01/01/2013
02/01/2013
03/01/2013
04/01/2013
05/01/2013
06/01/2013
07/01/2013
08/01/2013
10/01/2013
11/01/2013
12/01/2013
2014
输入< /th> +1 天 +1 天失败 +1 天 DST 失败
01/01/2014
02/01/2014
03/01/2014
04/01/2014
05/01/2014
06/01/2014
07/01/2014
08/01/2014
09/01/2014
10/01/2014
12/01/2014
2015
输入 +1天 +1天失败 +1天夏令时失败
01/01/2015
02/01/2015
03/01/ 2015
04/01/2015
05/01/2015
06/01/2015
07/01/2015
08/01/2015
09/01/2015
10/01/2015
11/ 01/2015
12/01/2015


@bzlm:是的,我认为该注释应为“如果'开始'日期与当前日期不在同一年或同一月,则此方法将失败”。我仍然担心用户会浏览答案而不阅读警告,因为它并不突出。谢谢。
我认为,即使这项工作是不正确的。 Date 没有这样的构造函数:var result = new Date(date);,参见 http://www.w3schools.com/js/js_dates.asp。即使这通常有效,有时也会由于转换为字符串而导致错误的结果,反之亦然。应该是 var result = new Date(date.getTime());
@Marcin,我同意 new Date(date.getTime()); 更好,但我认为 new Date(date) 不会因为字符串转换而给出错误答案。如果有人可以提供一个例子,我想看看。如果日期构造函数不以默认格式读取字符串,那该有多疯狂。据我了解,用户的本地时区和日期格式设置应该不会影响此功能的正确性。
@AnkitBalyan,查看其他答案。由于夏令时,它可能无法正常工作
@JimmyDillies,区别是 new Date();new Date(date)。第一个使用当前年、月和日创建;然后改变一天。第二个使用 given 年、月、日创建日期,然后更改日期。
J
Joel Coehoorn
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 年。
s
sbrbot

我的简单解决方案是:

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 天无法使用。调试听起来像是一场噩梦!!!
没有德鲁,它一年四季都可以使用。您可以设置大于 31 的日期偏移量或大于 12 的月份偏移量,此功能将重新计算为下个月的日期或明年的月份。例如: nextday=new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+40);是非常好的代码。
有 getMonth()+22 - 你认为它会起作用!?
我同意,使用这种方式。由于我们使用的是 setDate,所以我们刚刚遇到了夏令时问题。
J
Jason

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

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 代表一个绝对的时间点,并且它们没有时区,因此您必须根据您知道(在您的脑海中)日期代表的时区选择正确的方法来使用.
H
Hasee Amarathunga

这是用于在 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);

s
sufyan.shoaib

尝试

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

在遵循下面的主要示例时,只是花了很长时间试图弄清楚一年没有添加的交易是什么。

如果您只想简单地将 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);

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


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

我实现的最简单的方法是使用 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 方法。
s
serge
int days = 1;
var newDate = new Date(Date.now() + days * 24*60*60*1000);

CodePen

变天 = 2; var newDate = new Date(Date.now() + days * 24*60*60*1000); document.write('今天:'); document.write(new Date()); document.write('
新:'); document.write(newDate);


赞成不需要中间日期变量。
这是最好的答案,因为它没有突变
并非每一天都有 24 小时,它会因 DST 和闰秒而失败。
R
Ruslan López

如果可以,请使用 moment.js。 JavaScript 没有很好的原生日期/时间方法。以下是 Moment 的语法示例:

var nextWeek = moment().add(7, 'days');警报(下周);

参考: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 字节的磁盘空间。我想那是整个蜡球,但我不知道。无论如何,随便。没什么大不了的。
m
mark.nino.chua

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

例子:

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()。
s
sdgfsdh

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 库。


N
NicoESIEA

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

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

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

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


v
vaibhavmaster

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

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

K
Kamil Kiełczewski

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

new Date(+yourDate - 30 *86400000)

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


在尝试计算日期时间时,请始终记住计算机科学中基于毫秒的日期时间,(en.wikipedia.org/wiki/System_time#Retrieving_system_time) new Date(+yourDate + 30 * (24*60*60*1000))
R
Ruslan López

最简单的解决方案。

Date.prototype.addDays = function(days) { this.setDate(this.getDate() + parseInt(days));返回这个; }; // 然后调用 var newDate = new Date().addDays(2); //+2 天 console.log(newDate); // 或 var newDate1 = new Date().addDays(-2); //-2 天 console.log(newDate1);


我认为这是最好的解决方案。如果我们要扩展 Date 类,那么 Date 实例本身会更新会更有意义。
R
RemarkLima

迟到了,但是如果你使用 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 种语言和时区,你会希望你从类似时刻的东西开始;)
R
Rohit.007

您可以使用 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,如本解决方案中所述。
P
Prashant Pimpale

就这么简单:

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

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

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

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

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 和闰秒而失败。
r
ross

你可以试试:

var days = 50;

const d = new Date();

d.setDate(d.getDate() + days)

这应该运作良好。


我赞成这一点,但真正的一个衬线是 new Date( (new Date()).setDate((new Date()).getDate() + 1) )
V
Vahag Chakhoyan

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

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

J
Joshua Comeau

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

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

S
Skatox

为什么这么复杂?

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

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

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

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


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

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

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

C
Community

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

设置日期()

根据本地时间设置指定日期的月份日期 (1-31)。

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


我会链接到 ECMAScript 文档,但它们是以 PDF 格式发布的;(
重新“setDate() 的 mozilla 文档并不表示它将处理月末方案”。 “文档”已经更新,所以现在他们这样做了。 ;-)
D
Duncan

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

A
Aldo

短的:

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