如何使用JavaScript将天数添加到当前Date。 JavaScript是否具有诸如.Net的AddDay之类的内置函数?

#1 楼

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



 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的问题在于它是一个突变器,最好避免这种事情。 ECMA认为可以将Date视为可变类而不是不变结构。

评论


简化:Date.prototype.addDays = function(d){返回新的Date(this.valueOf()+ 864E5 * d);};

–邓肯
14-10-15在17:51

@Duncan您确定与上面相同吗?这只是增加了24小时,但一天并不总是24小时。我想问题是如何在不更改时间部分的情况下将日期部分增加1天。

–塔马斯·波瓦里(TamásBolvári)
2015年12月19日下午6:41

出于某种原因,864E5我更喜欢在我的代码中写24 * 60 * 60 :)

–火星罗伯逊
16年1月21日在20:53

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

–sbrbot
16年7月25日在21:44

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

– Gerard ONeill
16-11-22在16:53

#2 楼

正确答案:

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




 // Correct
function addDays(date, days) {
    var result = new Date(date);
    result.setDate(result.getDate() + days);
    return result;
}

// Bad Year/Month
function addDaysWRONG(date, days) {
    var result = new Date();
    result.setDate(date.getDate() + days);
    return result;
}

// Bad during DST
function addDaysDstFail(date, days) {
    var dayms = (days * 24 * 60 * 60 * 1000);
    return new Date(date.getTime() + dayms);    
}

// TEST
function formatDate(date) {
    return (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();
}

$('tbody tr td:first-child').each(function () {
    var $in = $(this);
    var $out = $('<td/>').insertAfter($in).addClass("answer");
    var $outFail = $('<td/>').insertAfter($out);
    var $outDstFail = $('<td/>').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 ? "right" : "wrong");
}); 

 body {
    font-size: 14px;
}

table {
    border-collapse:collapse;
}
table, td, th {
    border:1px solid black;
}
td {
    padding: 2px;
}

.wrong {
    color: red;
}
.right {
    color: green;
}
.answer {
    font-weight: bold;
} 

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<table>
    <tbody>
        <tr>
            <th colspan="4">DST Dates</th>
        </tr>
        <tr>
            <th>Input</th>
            <th>+1 Day</th>
            <th>+1 Day Fail</th>
            <th>+1 Day DST Fail</th>
        </tr>
        <tr><td>03/10/2013</td></tr>
        <tr><td>11/03/2013</td></tr>
        <tr><td>03/09/2014</td></tr>
        <tr><td>11/02/2014</td></tr>
        <tr><td>03/08/2015</td></tr>
        <tr><td>11/01/2015</td></tr>
        <tr>
            <th colspan="4">2013</th>
        </tr>
        <tr>
            <th>Input</th>
            <th>+1 Day</th>
            <th>+1 Day Fail</th>
            <th>+1 Day DST Fail</th>
        </tr>
        <tr><td>01/01/2013</td></tr>
        <tr><td>02/01/2013</td></tr>
        <tr><td>03/01/2013</td></tr>
        <tr><td>04/01/2013</td></tr>
        <tr><td>05/01/2013</td></tr>
        <tr><td>06/01/2013</td></tr>
        <tr><td>07/01/2013</td></tr>
        <tr><td>08/01/2013</td></tr>
        <tr><td>09/01/2013</td></tr>
        <tr><td>10/01/2013</td></tr>
        <tr><td>11/01/2013</td></tr>
        <tr><td>12/01/2013</td></tr>
        <tr>
            <th colspan="4">2014</th>
        </tr>
        <tr>
            <th>Input</th>
            <th>+1 Day</th>
            <th>+1 Day Fail</th>
            <th>+1 Day DST Fail</th>
        </tr>
        <tr><td>01/01/2014</td></tr>
        <tr><td>02/01/2014</td></tr>
        <tr><td>03/01/2014</td></tr>
        <tr><td>04/01/2014</td></tr>
        <tr><td>05/01/2014</td></tr>
        <tr><td>06/01/2014</td></tr>
        <tr><td>07/01/2014</td></tr>
        <tr><td>08/01/2014</td></tr>
        <tr><td>09/01/2014</td></tr>
        <tr><td>10/01/2014</td></tr>
        <tr><td>11/01/2014</td></tr>
        <tr><td>12/01/2014</td></tr>
        <tr>
            <th colspan="4">2015</th>
        </tr>
        <tr>
            <th>Input</th>
            <th>+1 Day</th>
            <th>+1 Day Fail</th>
            <th>+1 Day DST Fail</th>
        </tr>
        <tr><td>01/01/2015</td></tr>
        <tr><td>02/01/2015</td></tr>
        <tr><td>03/01/2015</td></tr>
        <tr><td>04/01/2015</td></tr>
        <tr><td>05/01/2015</td></tr>
        <tr><td>06/01/2015</td></tr>
        <tr><td>07/01/2015</td></tr>
        <tr><td>08/01/2015</td></tr>
        <tr><td>09/01/2015</td></tr>
        <tr><td>10/01/2015</td></tr>
        <tr><td>11/01/2015</td></tr>
        <tr><td>12/01/2015</td></tr>
    </tbody>
</table> 




评论


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

–备用字节
13年10月30日在19:27

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

– bzlm
13-10-30在19:33

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

–备用字节
2013年10月30日19:40



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

–马辛
2015年11月10日在10:22



@AnkitBalyan,请参阅其他答案。由于夏令时,它可能无法正常工作

–备用字节
17年7月31日在16:49

#3 楼

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


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

评论


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

– d -_- b
2010-3-31在2:44



@sims月被索引为0。第三个月是四月

–乔尔·科恩(Joel Coehoorn)
2010-3-31的3:26

为什么需要创建2个单独的日期对象?为什么不简单地使用相同的日期对象:var d = new Date(); d.setDate(d.getDate()+ 1);?

–约瑟夫·西尔伯(Joseph Silber)
2012年3月25日15:03

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

–德鲁·诺克斯(Drew Noakes)
13-10-14在10:55

@DrewNoakes-您断言多年不起作用的主张是错误的。 getDate返回月份中的日期,而不是“该年的日期”。例如。 var d = new Date(2015,11,30); d.setDate(d.getDate()+ 370)得出2017年1月3日,跨2年。

–RobG
16 Dec 6'在23:09

#4 楼

我的简单解决方案是:

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(可能有问题)

–ÁlvaroGonzález
13年2月20日在11:45

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

–德鲁·诺克斯(Drew Noakes)
13-10-14在10:59

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

–sbrbot
13年11月11日在7:30

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

–sbrbot
15年6月11日在11:20

我同意,使用这种方式。由于我们使用setDate,因此由于夏时制而出现了一个错误。

–Jelle den Burger
17年4月11日在6:41

#5 楼

这些答案对我来说似乎令人困惑,我更喜欢:

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)

–诺亚·哈里森(Noah Harrison)
2012年3月20日14:55



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

– Andy Novocin
2014年6月23日15:12

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

– Corey Alix
14年7月18日在16:44

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

–马特本
2014年11月6日12:05

同意Matmarbon的观点,Corey Alix的回答会更好。我实施了Sparebytes中排名最高的答案,但得到了错误的结果;科里·阿利克斯(Corey Alix)的答案奏效了

–罗里
11月13日0:28

#6 楼

尝试

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


使用setDate()添加日期并不能解决您的问题,请尝试将日期添加到2月,如果尝试在其中添加新的日期,不会达到您的期望。

评论


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

–sbrbot
13年1月12日在9:06

关于setDate()的“ Feb”问题的任何证据吗?是这个吗:stackoverflow.com/questions/5497637/…

–布伦特·布拉德本(Brent Bradburn)
13年2月4日,下午3:21

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

–失望
15年3月17日在8:17

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

–RobG
16 Dec 6'23:13



#7 楼

只是花了很长时间尝试按照下面的主要示例来计算一年未增加的交易。

如果您只想在日期中加上n天,则最好go:


myDate.setDate(myDate.getDate()+ n);


或or风云的版本

var theDate = new Date(2013, 11, 15);
var myNewDate = new Date(theDate);
myNewDate.setDate(myNewDate.getDate() + 30);
console.log(myNewDate);


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

评论


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

– Cesc
2014年8月8日在6:01

#8 楼

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


CodePen




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




评论


赞成不需要中间日期变量。

–杰夫·洛里(Jeff Lowery)
17年1月4日,1:15



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

– knocte
17年8月21日在16:24

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

–史蒂芬(Stephan)
17年8月24日在12:59



#9 楼

如果可以,请使用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/

评论


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

–user2910265
2014年10月30日16:15
现代说明:Moment.js的添加量如此之小,以至于难以置信。它有几百个KB,并且不是开箱即用的Webpack友好版本。

–约书亚·科莫
16年11月25日在13:24

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

– Freewalker
17年6月6日在20:59

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

–user2910265
17年6月6日在21:23

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

–birdus
17年12月4日在18:53

#10 楼

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

示例:

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()方法不适用于跨越夏时制时间界限的日期。

–mskfisher
13年4月29日在0:02

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

–罗宾
15年4月23日在13:03

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

– Suamere
16年4月16日在19:55

#11 楼

专为管道运算符设计的解决方案:

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

#12 楼

这是在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 m = new Date();
m.setFullYear(m.getFullYear() + 5);


#13 楼

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

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


#14 楼

减去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))

– Ashraf Abusada
1月24日16:49



#15 楼

最简单的解决方案。




  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实例本身就是更新的。

– rl
17年6月13日在8:25

#16 楼

晚会晚了,但是如果您使用jQuery,那么有个很棒的插件叫做Moment:
> http://momentjs.com/docs/#/manipulating/

还有很多其他好东西!

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

评论


此刻不需要jQuery :)

–aikeru
2014年10月11日,下午3:51

在这种情况下甚至更好!

–备注Lima
14-10-11在8:10

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

– Caseyamcl
2014年12月9日下午13:55

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

–法国
16年2月18日在21:25

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

–备注Lima
17 Mar 5 '17 at 5:08

#17 楼

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

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


评论


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

–sbrbot
13年1月12日在9:08

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

– Andy Novocin
14年6月23日在15:17

#18 楼

我知道是旧的,但有时我会这样:

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


评论


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

–uadrive
2015年5月7日在4:17

给出最简单的答案。在此基础上,原型'addDays'将如下所示:Date.prototype.addDays = function(days){返回新的Date(this.getTime()+(864e5 * days));};

–CrazyIvan1974
2015年6月3日在2:11



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

–史蒂芬(Stephan)
17年8月24日在13:01

#19 楼

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


#20 楼

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

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


#21 楼

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

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


#22 楼

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

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


#23 楼

如此简单:

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


评论


虽然这样做确实会增加UTC天数,但它使用本地方法,并且不允许时间不长于24小时的本地天数,这发生在时区偏移量发生变化(例如,夏令时前后)时。

–RobG
19年8月22日在10:59



#24 楼

setDate()的mozilla文档未表明它将处理月末场景。
请参阅https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/Date
setDate()

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

这就是为什么我在使用setTime()时我需要增加几天。

评论


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

–布雷克·米尔斯(Blake Mills)
2012年9月28日在20:37

关于“针对setDate()的Mozilla文档未表示它将处理月末情况”。 “文档”已更新,所以现在可以了。 ;-)

–RobG
16年6月6日在23:15

#25 楼

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

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


#26 楼

我使用类似这样的东西:

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


#27 楼

用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方法,则不会破坏任何内容。

#28 楼

为什么这么复杂?
假设您将要添加的天数存储在一个名为days_to_add的变量中。
那么这段简短的代码应该做到这一点:
calc_date = new Date(Date.now() +(days_to_add * 86400000));

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

#29 楼

我实现的最简单的方法是使用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)

`

#30 楼

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

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对象即可执行相同的操作。

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

评论


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

–史蒂芬(Stephan)
17年8月24日在13:00

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

– Vakhtang
17年8月24日在20:12



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

–史蒂芬(Stephan)
17年8月25日在7:57