为JavaScript日期添加天数


1091

如何Date使用JavaScript 来增加当前日期。JavaScript是否具有诸如.Net的内置函数AddDay

Answers:


1206

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

Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
}

var date = new Date();

alert(date.addDays(5));

这样可以在必要时自动增加月份。例如:

8/31 +1天将变成9/1

setDate直接使用的问题是它是一个变种器,最好避免这种事情。ECMA认为适合Date作为可变类而不是不变结构。


17
简化:Date.prototype.addDays=function(d){return new Date(this.valueOf()+864E5*d);};
Duncan

27
@Duncan您确定与上面相同吗?这简单地增加了24小时,但是一天并不总是24小时。我想问题是如何在不更改时间部分的情况下将日期部分增加1天。
塔玛斯·波瓦里(DamásBolvári)2015年

88
864E5由于某些原因,我更喜欢24*60*60用我的代码写:)
Mars Robertson

62
伙计们,请不要使用添加864E5的方法,因为这不会占用夏令时,因为这可能是23或25小时。
sbrbot '16

12
对于那些担心夏令时的人,请不要。这些算法更改基础日期,而不更改日期的解释方式。DST在日期的获取器和设置器中实现-吸收器在夏季减去一个小时,而设置器在夏季将该小时加回去以标准化时间。但是,只有在使用绝对小时时,才需要解释相对小时。这就是为什么日期数学有效。恕我直言...
Gerard ONeill

754

正确答案

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


@bzlm,是的,基本相同。它只是不修改Date原型。我还想指出主要答案中的缺陷。
2013年

两周前对接受的答案进行了编辑,以指出其缺陷。您认为它需要进一步编辑吗?如果是这样,怎么办?
bzlm

7
@bzlm:是的,我相信注释应该显示为“如果'起始'日期与当前日期不在同一年或月份,则此方法将失败。我仍然担心用户会浏览答案,而不会阅读警告,因为它并不突出。谢谢。
13年

3
我认为,即使这项工作也不正确。Date没有这样的构造函数:var result = new Date(date); ,请参阅http://www.w3schools.com/js/js_dates.asp。即使正常工作,由于转换为字符串,有时也会导致错误的结果,反之亦然。它应该是var result = new Date(date.getTime());
Marcin

2
@AnkitBalyan,请参阅其他答案。由于夏令时,它可能无法正常工作
备用字节'17

188
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);

注意,因为这可能很棘手。设置“明天”时,它仅起作用,因为其当前值与“今天”的年和月相匹配。但是,将日期设置为“ 32”通常仍可以将其移至下个月。


1
是啊 那是什么 (运行于2010年3月31日):今天=新的Date();明天=新的Date(); 明日setDate(today.getDate()+ 1); alert(tomorrow.getMonth()); 说“ 3”。警报(明天); 是正确的...为什么?
d -_- b 2010年

12
@sims月被索引为0。第3个月是4月
Joel Coehoorn 2010年

6
为什么需要创建2个单独的日期对象?为什么不直接使用相同的日期对象:var d = new Date(); d.setDate( d.getDate() + 1 );
约瑟夫·西尔伯2012年

8
这种方法多年来无法奏效。如果您的开始日期是几年前,则getDate()返回该年的日期。然后,称setDate套在当天当年。因此,这不是一个好的通用解决方案。@AnthonyWJones的答案实际上是正确的。
Drew Noakes

3
@DrewNoakes-您断言多年没有用的断言是错误的。getDate返回月份中的日期,而不是“该年的日期”。例如,var d = new Date(2015,11,30);d.setDate(d.getDate() + 370)给定2017年1月3日,为期2年。
RobG '16

123

我的简单解决方案是:

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

此解决方案不存在夏令时的问题。此外,您可以添加/扣除年份,月份,天数等的任何偏移量。

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

是正确的代码。


13
注意:此重置时间为00:00:00(可以是一个问题或没有)
阿尔瓦罗·冈萨雷斯

如您所说,在任何月份的最后一天都无效。使其在一年中的12天不可用。听起来像是噩梦般的调试!!!
Drew Noakes

6
没有Drew,它一年四季都可以使用。您可以输入大于31的日期偏移量或大于12的月份偏移量,此函数会将其重新计算为下个月的日期或明年的月份。因此,例如:nextday = new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+ 40); 是完美的代码。
sbrbot

有getMonth()+ 22-您认为它将起作用吗?
sbrbot

1
我同意,使用这种方式。由于使用夏令时,我们仅因夏时制而遇到一个错误setDate
耶尔(Jelle)

95

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

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

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

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


46
此解决方案不考虑夏令时。因此,例如,它将在23小时后返回相同的日期: new Date(new Date('11/4/2012').getTime() + 86400000)
Noah Harrison

6
@NoahMiller您提出的问题可能是功能而不是错误!每天增加24小时有时是正确的做法,目的是根据DST知道结果时间。您的示例返回的日期的时间值为11月4日晚上11点,也就是该天的24小时。原始海报询问日期时间,这似乎表明对一天中正确时间的渴望。如果您的目标是24小时之后,那么此答案是正确的。
Andy Novocin 2014年

3
我同意诺亚(Noah),var d2 = new Date(d1.valueOf()+ 24 * 60 * 60 * 1000)照其说法,为日期添加了整整一天的价格变动。
Corey Alix

6
在某些情况下(例如1天Cookie),这是绝对正确的,并且比其他大多数情况更简单。我不明白为什么它有这么多的反对票和这么少的支持票:/
Matmarbon 2014年

48

尝试

var someDate = new Date();
var duration = 2; //In Days
someDate.setTime(someDate.getTime() +  (duration * 24 * 60 * 60 * 1000));

使用setDate()添加日期不会解决您的问题,请尝试在2月增加几天,如果尝试向其添加新日期,则不会达到预期的效果。


26
不,这不应标记为正确答案,因为此解决方案假定每天都有24 * 60 * 60 * 1000秒,但没有(夏时制)!
sbrbot

有任何关于“ Feb”问题的证据setDate()吗?是这个

9
+1应当将其标记为正确答案。我相信“夏令时”是关于表示的,而不是关于value的,而value只是毫秒数。从价值的角度来看,天是CONST的毫秒数,但就表示而言,可能有所不同。
disfated

1
@disfated-这不是正确的答案。夏令时结束的一天有25个小时,但是此方法仅增加24个小时,因此日期将相同。如果改用UTC方法,则可以使用24小时来代表一天,但是为什么在使用setDate时比较麻烦呢?;-)
RobG '16

38

遵循下面的示例,花了很长时间才试图弄清当年未达成的交易。

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

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


7
阅读所有答案,直到我在这里找到这颗宝石。现在这很有意义。令人惊讶的是,今天/明天的事情几乎被所有答案复制了,而这根本没有意义,而且并不是作者最喜欢的答案(最喜欢的评论)中所说的“为了可读性和清晰度”,它是混乱和糟糕的做法和错误的
塞斯克

23

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

var nextWeek = moment().add(7, 'days');
alert(nextWeek);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>

参考:http : //momentjs.com/docs/#/manipulating/add/


1
@ kpull1,询问者没有通过询问内置解决方案是否存在来限制解决方案域。
2014年

4
现代说明:Moment.js的添加量如此之小,以至于难以置信。它有几百个KB,而且不是现成的Webpack友好版本。
约书亚·科摩

1
我们首选的库是date-fns。Webpack友好,快速,并且将日期视为不可变的。
Freewalker

1
@LukeWilliams直到现在都没有听说过date-fns。会检查出来。谢谢。
user2910265

2
@JoshuaComeau如果从cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.3/moment.min.js下载,它将占用磁盘上的53248个字节。我想那是整个蜡球,但我不知道。无论如何 没什么大不了的。
birdus

22
int days = 1;
var newDate = new Date(Date.now() + days * 24*60*60*1000);

密码笔

var days = 2;
var newDate = new Date(Date.now() + days * 24*60*60*1000);

document.write('Today: <em>');
document.write(new Date());
document.write('</em><br/> New: <strong>');
document.write(newDate);


2
投票表示不需要中间日期变量。
杰夫·洛里

这是最好的答案,因为它没有突变
knocte

并非每天都有24小时,但DST和leap秒都会失败。
斯蒂芬

19

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

例:

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

7
.addDays()方法不适用于跨越夏时制时间界限的日期。
mskfisher 2013年

1
这是更好的答案之一,因为您(正确)使用自epoc以来的毫秒数来表示日期/时间,并添加用于调整的毫秒数...为什么您不为此添加“ addMonths”! ?为什么不增加年份?你感到无聊吗?
罗宾

除月份外,时间段可以用静态数字表示。但是月份可以是四个不同的长度。此外,从Dday开始的任何更长的时间段长度在DST处都可能具有可变的长度,因此如果没有其他级别的复杂性,您将无法再使用基于时间的加法。我添加了addYears(),并修复了addMonths()。
Suamere '16

14

无需使用第二个变量,您可以将x替换为接下来的x天:

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

14

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

new Date(+yourDate - 30 *86400000)


在尝试计算日期时间时,请始终记住该日期时间以计算机科学中的毫秒为单位,(en.wikipedia.org/wiki/System_time#Retrieving_system_time)new Date(+ yourDate + 30 *(24 * 60 * 60 * 1000))
Ashraf Abusada

13

最简单的解决方案。

 Date.prototype.addDays = function(days) {
   this.setDate(this.getDate() + parseInt(days));
   return this;
 };

 // and then call

 var newDate = new Date().addDays(2); //+2 days
 console.log(newDate);

 // or

 var newDate1 = new Date().addDays(-2); //-2 days
 console.log(newDate1);


我认为这是最好的解决方案。如果我们要扩展Date类,那么更好地理解Date实例本身就是更新的。
Porlune

10

感谢Jason的回答能按预期工作,这是您的代码和AnthonyWJones方便的格式的结合:

Date.prototype.addDays = function(days){
    var ms = new Date().getTime() + (86400000 * days);
    var added = new Date(ms);
    return added;
}

6
当一天的时间少于或等于86400000秒时,它不会考虑夏令时,并且可能导致代码中出现逻辑错误(程序错误)。
sbrbot

有时这是必需的。eBay API的x天拍卖会是基于24小时制的,因此如果DST状态在拍卖中途更改,则您的商品的拍卖结束时间将不同于拍卖的时间。在那种情况下,您需要使用这种类型的函数来避免逻辑错误。
Andy Novocin 2014年

10

晚会晚了,但是如果您使用的jQuery话,那么有个很棒的插件叫做Moment:

http://momentjs.com/

var myDateOfNowPlusThreeDays = moment().add(3, "days").toDate();

http://momentjs.com/docs/#/manipulating/

还有很多其他好东西!

编辑:jQuery参考删除由于aikeru的评论


1
一刻不需要jQuery :)
aikeru 2014年

在这种情况下甚至更好!
RemarkLima 2014年

1
是的,在使用Plain ol'JS讨论了太长时间之后,我使用了Moment,它才有效(tm)!
caseyamcl 2014年

当几行JS可以使用时,为什么还要使用插件?
frenchie 2016年

@frenchie,因为它开始于几行JS,并且因为很明显您的应用程序正在处理与日期,日期和时间相关的信息,所以很快就会有几千行JS,然后将要求您将应用程序本地化12种语言和时区,但您希望您从类似“时刻”开始;)
RemarkLima

10

专为管道运营商设计的解决方案:

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


8

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

function addDays(days) {
    return new Date(Date.now() + 864e5 * days);
}

2
这对我来说最有意义。它简单,优雅,不会因数月/数年的问题而祈祷。
uadrive

1
给出最简单的答案。基于此,原型“ addDays”将如下所示:Date.prototype.addDays = function(days) {return new Date(this.getTime() + (864e5 * days));};
CrazyIvan1974年

并非每天都有24小时,但DST和leap秒都会失败。
斯蒂芬

8

提出的解决方案在夏令时方面存在问题。

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

8

您可以使用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;

8

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

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

7

setDate()的Mozilla文档未指示它将处理月末情况。参见https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

设置日期()

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

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


我将链接到ECMAScript文档,但是它们以PDF发行;(
Blake Mills

1
RE“ 的Mozilla浏览器的setDate文档()并不表示它会处理的情况下本月结束 ”。“文档”已经更新,因此现在可以了。;-)
RobG

7

就这么简单:

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

2
虽然这确实会增加UTC天数,但它使用本地方法,并且不允许不超过24小时的本地天数,这发生在时区偏移量更改时(例如,夏令时的进出)。
RobG

6

我想我也会给出一个答案:就
个人而言,我喜欢避免不必要的变量声明,方法调用和构造函数调用,因为它们在性能上都很昂贵。(当然,在合理的范围内)
我打算将其保留为@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。这意味着,如果您添加了超过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


5

我用类似的东西:

new Date(dateObject.getTime() + amountOfDays * 24 * 60 * 60 * 1000)

可以节省时间:

new Date(new Date(2014, 2, 29, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)

适用于新年:

new Date(new Date(2014, 11, 31, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)

可以参数化:

function DateAdd(source, amount, step) {
  var factor = 1;
  if (step == "day") factor = 24 * 60 * 60 * 1000;
  else if (step == "hour") factor = 60 * 60 * 1000;
  ...
  new Date(source.getTime() + amount * factor);
}

4

我正在使用以下解决方案。

var msInDay = 86400000;
var daysToAdd = 5;
var now = new Date();
var milliseconds = now.getTime();
var newMillisecods = milliseconds + msInDay * daysToAdd;
var newDate = new Date(newMillisecods);
//or now.setTime(newMillisecods);

Date具有一个接受int的构造函数。此参数表示1970年1月1日之前/之后的总毫秒数。它还具有setTime方法,该方法无需创建新的Date对象即可执行相同的操作。

我们在这里所做的是将天数转换为毫秒,并将此值添加到getTime提供的值中。最后,将结果提供给Date(milliseconds)构造函数或setTime(milliseconds)方法。


并非每天都有24小时,但DST和leap秒都会失败。
斯蒂芬

史蒂芬(Stephan),请问其他图书馆对此有帮助吗?
Vakhtang

now.setDate(now.getDate() + days);自动处理DST更改。而且我必须纠正,leap秒在JS时间戳中被忽略了。
斯蒂芬

4

编辑: 代替setTime()(或setHours()),您可以这样做:

Date.prototype.addDays= function(d){
  this.setDate(this.getDate() + d);
  return this;
};

var tomorrow = new Date().addDays(1);

旧:

除了使用,setTime()您可以使用setHours()

Date.prototype.addDays= function(d){
    this.setHours(this.getHours() + d * 24);
    return this;
};

var tomorrow = new Date().addDays(1);

参见JSFiddle ...


按照这种逻辑,您还可以添加一天;)d.setDate(d.getDate() + 1);
Rivenfall


4

有一个setDategetDate方法,使您可以执行以下操作:

var newDate = aDate.setDate(aDate.getDate() + numberOfDays);

如果您要减去天数并以易于DateHelper理解的格式设置日期格式,则应考虑创建一个类似以下内容的自定义对象:

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Add 20 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), 20));

(另请参阅此小提琴


4

用javascript扩展原型可能不是一个好主意,尤其是在专业代码库中。

您想要做的是扩展本机Date类:

class MyCustomDate extends Date {

  addDays(days) {
    const date = new MyCustomDate(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
  }
  
}

const today = new MyCustomDate();

const nextWeek = today.addDays(7)

console.log(nextWeek)

这样,如果有一天Javascript实现了本机addDays方法,您将不会破坏任何东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.