将日期添加到JavaScript日期

Ash*_*esh 988 javascript time datetime date

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

Ant*_*nes 1101

您可以创建一个: -

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));
Run Code Online (Sandbox Code Playgroud)

如果需要,这会自动增加月份.例如:

8/31 + 1天将成为9/1.

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

  • ```864E5```由于某种原因我喜欢在我的代码中写````24*60*60``` :) (78认同)
  • 伙计们,不要使用添加864E5的方法,因为这不会带来夏令时差异,天数可以是23或25小时. (53认同)
  • @Duncan你确定这和上面一样吗?这个只增加24小时,但[一天不总是24小时](https://en.wikipedia.org/wiki/Daylight_saving_time).我想问题是如何将日期部分增加1天,而不更改时间部分. (25认同)
  • 简化:`Date.prototype.addDays = function(d){return new Date(this.valueOf()+ 864E5*d);};` (16认同)
  • 对于那些担心夏令时的人 - 不要.这些算法会更改基础日期,而不会更改日期的解释方式.DST在日期的吸气剂和设定者中实施 - 吸气剂在夏季减去一小时,并且设定者在夏季将该小时添加回来以标准化时间.但只有在使用绝对小时时 - 相对小时才不需要解释.这就是日期数学运作的原因.恕我直言... (9认同)
  • 当你需要知道在几天24小时后的"天"之后小时是否会有所不同时,这些解决方案无法处理.如果你想要时间检测夏令时,请将`getDate` /`setDate` /`days`调整为`getTime` /`setTime` /`days*24*60*60*1000`. (5认同)
  • 那应该是“24*60*60*1000” (3认同)
  • 尽管不更改调用方法的日期可能是一个原则问题,但这并不明智。所有* set *方法都会使日期发生变化并返回时间值,对于该方法而言,不更改日期并返回新的日期对象而不是时间值并不实用。 (2认同)
  • 只是为@sbrbot 的观点提供一个示例:一旦您转换为微秒(使用 valueOf() 或 getTime()),DST 将开始扰乱您的计算。例如,使用@Duncan 的原型试试这个,你会失去一个小时:`d = new Date( 2016, 10, 4 )` `d.addDays(3)` (2认同)
  • DAYLIGHT SAVINGS - 对不起,上限,但这很重要,需要脱颖而出:) (2认同)

spa*_*tes 695

正确答案:

function addDays(date, days) {
  var result = new Date(date);
  result.setDate(result.getDate() + days);
  return result;
}
Run Code Online (Sandbox Code Playgroud)

答案不正确:

这个答案有时会提供正确的结果,但通常会返回错误的年份和月份.此答案唯一有效的时间是您添加天数的日期恰好具有当前年份和月份.

// Don't do it this way!
function addDaysWRONG(date, days) {
  var result = new Date();
  result.setDate(date.getDate() + days);
  return result;
}
Run Code Online (Sandbox Code Playgroud)

证明/例子

检查这个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");
});
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

  • @bzlm:是的,我认为这个说明应该是"如果'从'日期不是**年或******当前日期**,这种方法就会失败".我仍然担心用户会看一眼答案,而不是阅读警告,因为它没有突出.谢谢. (7认同)
  • 我想,即使这项工作不正确.Date没有这样的构造函数:_var result = new Date(date); _,参见[http://www.w3schools.com/js/js_dates.asp](http://www.w3schools.com/js/ js_dates.asp).即使这通常有效,但由于转换为字符串,有时会导致错误的结果,反之亦然.它应该是_var result = new Date(date.getTime()); _ (3认同)
  • @AnkitBalyan,查看其他答案.由于Daylight Savings Time,它可能无法正常工作 (2认同)
  • @JimmyDillies,区别在于“new Date();”与“new Date(date)”。第一个使用**当前**年、月、日创建;然后更改日期。第二个创建具有**给定**年、月、日的日期,然后更改日期。 (2认同)

Joe*_*orn 174

var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);
Run Code Online (Sandbox Code Playgroud)

要小心,因为这可能很棘手.设置"明天"时,它只能起作用,因为它的当前值与"今天"的年份和月份相匹配.但是,设置为"32"之类的日期数字通常仍可正常工作,以便将其移至下个月.

  • @sims month是0索引.第3个月是4月 (12认同)
  • 这种方法多年来都不起作用.如果你的开始日期是几年前的那么,`getDate()`返回那年的_day_.然后,调用`setDate`设置_current year_中的日期.所以它不是一个很好的通用解决方案.[@ AnthonyWJones的回答](http://stackoverflow.com/a/563442/24874)实际上可以正常工作. (8认同)
  • 为什么需要创建2个单独的日期对象?为什么不简单地使用相同的日期对象:`var d = new Date(); d.setDate(d.getDate()+ 1);`? (6认同)
  • @DrewNoakes-你断言它不能多年使用是错误的.*getDate*返回当月的日期,而不是"当年的那一天".例如`var d = new Date(2015,11,30); d.setDate(d.getDate()+ 370)`给出2017年1月3日,超过2年. (3认同)
  • 如果仅在月份之间切换时执行,使用“new”创建两个“Date”对象将会失败。`today.getDate()` 将返回该月的最后一天,而 `tomorrow` 的月份已经在下个月了。所以“明天”最终会完全错误。 (2认同)

sbr*_*bot 111

我的简单解决方案是:

nextday=new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+1);
Run Code Online (Sandbox Code Playgroud)

这个解决方案没有夏令时的问题.此外,可以添加/分配任何年,月,日等的偏移量.

day=new Date(oldDate.getFullYear()-2,oldDate.getMonth()+22,oldDate.getDate()+61);
Run Code Online (Sandbox Code Playgroud)

是正确的代码.

  • 注意:这会将时间重置为00:00:00(可能是一个问题) (12认同)
  • 没有德鲁,它可以在一年中的所有日子里使用.您可以将日期偏移量大于31或月份偏移量大于12,此功能将在下个月或下个月的某一天重新计算.例如:nextday = new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+ 40); 是完美的代码. (5认同)

Jas*_*son 85

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

var ms = new Date().getTime() + 86400000;
var tomorrow = new Date(ms);
Run Code Online (Sandbox Code Playgroud)

getTime()给出了自1970年以来的毫秒数,86400000是一天中的毫秒数.因此,ms包含所需日期的毫秒数.

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

  • 此解决方案不考虑夏令时.因此,例如,这将返回相同的日期,23小时后:`新日期(新日期('11/4/2012').getTime()+ 86400000)` (43认同)
  • @NoahMiller你提出的问题可能是一个功能而不是一个bug!每天增加24小时有时是正确的做法,目标是根据夏令时知道结果时间.您的示例返回的日期在11月4日的时间值为晚上11点,即该特定日期后24小时的时间值.原始海报询问了约会时间,这似乎表明了对一天中正确时间的渴望.如果您的目标是24小时后的时间,那么这个答案是正确的. (6认同)
  • 这对于某些情况(例如1天的cookie)绝对正确,并且比大多数其他情况更简单.我不明白为什么它有这么多的downvotes和这么少的upvotes:/ (6认同)
  • 我同意Noah,var d2 = new Date(d1.valueOf()+ 24*60*60*1000)按照它说的做,为日期添加一整天的价值. (3认同)
  • 当(且仅当)您的日期代表 UTC 日期/时间或者您只想添加 24 小时制的日期时,此答案才是正确的。当(且仅当)您的日期代表当地时间时,其他一些答案(AnthonyWJones 的)是正确的。需要理解的是,JavaScript 日期代表一个绝对的时间点,并且它们没有时区,因此您必须根据您知道(在您的脑海中)日期代表的时区选择正确的方法。 。 (2认同)

suf*_*aib 48

尝试

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

使用setDate()添加日期不会解决您的问题,尝试添加一些日期到2月,如果您尝试添加新的日期,它不会导致您的预期.

  • 不,这不应该被标记为正确的答案,因为这个解决方案假设每天有24*60*60*1000秒,但它没有(夏令时)! (25认同)
  • +1这应该被标记为正确的答案.我相信"夏令时"是关于**演示**而不是**值**,这只是毫秒数.从**值** - 观点 - 日是CONST毫秒数,而在**演示**方面它可能会有所不同. (8认同)

小智 38

这是用于在 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);
Run Code Online (Sandbox Code Playgroud)


Rum*_*ser 36

花了很多时间试图弄清楚当年的交易是什么,而不是在遵循下面的主要示例时添加.

如果您只想简单地添加n天到您最好的日期:

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

或者是longwinded版本

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

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

  • 阅读所有答案,直到我在这里找到这个宝石.现在这是有道理的.令人惊讶的是,今天/明天的事情几乎在所有的答案中被复制了,当它完全没有意义时,并不是"可读性和清晰度",正如作者在最受欢迎的答案中所说的那样 - 在最受欢迎的评论中 - 这是令人困惑的,不好的做法和错误 (7认同)

小智 23

我实现的最简单的方法是使用 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)
Run Code Online (Sandbox Code Playgroud)

`

  • 到目前为止,这是该问题最优雅的解决方案,因为它处理了这样一个事实,即它处理设置超过一个月的天数的令人讨厌的情况。你可以像...function addTime(years, month, day) 这样的函数从字面上正确。如果你想为它疯狂,你可以添加小时、分钟、秒和毫秒。我曾经在 Unity 中做了很多事情来跟踪游戏中的时间,因为它使用了 Epoch 方法。 (2认同)

use*_*265 22

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

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

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

  • 现代说明:为了这么小的目的,Moment.js非常重要.它是几百KB,并不是开箱即用的webpack友好的. (3认同)
  • 我们首选的库是 date-fns。Webpack 友好、快速,并将日期视为不可变。 (2认同)
  • @JoshuaComeau如果从https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.3/moment.min.js下载,它将占用磁盘上的53248个字节。我想那是整个蜡球,但我不知道。无论如何 没什么大不了的。 (2认同)

Ser*_*rge 21

int days = 1;
var newDate = new Date(Date.now() + days * 24*60*60*1000);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

  • Upvote不需要中间日期变量. (2认同)

Nic*_*IEA 18

最简单的答案是,假设需要将 1 天添加到当前日期:

var currentDate = new Date();
var numberOfDayToAdd = 1;
currentDate.setDate(currentDate.getDate() + numberOfDayToAdd );
Run Code Online (Sandbox Code Playgroud)

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

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


小智 17

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

例:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • .addDays()方法不适用于跨越夏令时边界的日期. (7认同)
  • 这是这里更好的答案之一,因为您(正确地)使用自 epoc 以来的毫秒数来表示日期/时间,并添加毫秒数以进行调整……那为什么您没有将其保留为“addMonths”! ? 为什么不添加年份?你觉得无聊吗? (2认同)

sdg*_*sdh 17

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

const addDays = days => date => {
  const result = new Date(date);

  result.setDate(result.getDate() + days);

  return result;
};
Run Code Online (Sandbox Code Playgroud)

用法:

// Without the pipeline operator...
addDays(7)(new Date());

// And with the pipeline operator...
new Date() |> addDays(7);
Run Code Online (Sandbox Code Playgroud)

如果您需要更多功能,我建议您查看date-fns库。


Ald*_*ldo 16

短的:

function addDays(date, number) {
  const newDate = new Date(date);
  return new Date(newDate.setDate(newDate.getDate() + number));
}

console.log({
  tomorrow: addDays(new Date(), 1)
});
Run Code Online (Sandbox Code Playgroud)

进步:

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'),
});
Run Code Online (Sandbox Code Playgroud)

通过jperl提供的修复

  • 但是,这将修改您传递给函数的日期对象。如果你执行“addDays(today, 1)”,今天将是明天。`function addDays(date, number) { const newDate = new Date(date) return new Date(newDate.setDate(newDate.getDate() + number)); }` (2认同)
  • 为什么不“返回 newDate”?为什么要使用这种双层包装? (2认同)

小智 15

你可以试试:

var days = 50;

const d = new Date();

d.setDate(d.getDate() + days)
Run Code Online (Sandbox Code Playgroud)

这应该运作良好。

  • 我对此表示赞同,但真正的衬里是 new Date( (new Date()).setDate((new Date()).getDate() + 1) ) (3认同)

amp*_*hts 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);
Run Code Online (Sandbox Code Playgroud)


小智 11

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

let d=new Date(new Date().getTime() + (7 * 24 * 60 * 60 * 1000));
Run Code Online (Sandbox Code Playgroud)


Dil*_*ung 11

就这么简单:

new Date((new Date()).getTime() + (60*60*24*1000));
Run Code Online (Sandbox Code Playgroud)

  • 虽然这确实添加了 UTC 天,但它使用本地方法,并且不允许本地日期不是 24 小时长,这种情况在时区偏移发生变化时(例如进入和退出夏令时)发生。 (2认同)

Oli*_*ier 9

感谢Jason的回答符合预期,这里是您的代码和AnthonyWJones的便捷格式的混合:

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

  • 如果一天中的时间多于或少于86400000秒,则不会考虑夏令时,并且可能导致代码中出现逻辑错误(程序错误). (6认同)

Rem*_*ima 9

晚会,但如果你使用jQuery那么有一个很棒的插件叫Moment:

http://momentjs.com/

var myDateOfNowPlusThreeDays = moment().add(3, "days").toDate();
Run Code Online (Sandbox Code Playgroud)

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

还有很多其他好东西!

编辑:感谢aikeru的评论删除了jQuery参考

  • 时刻不需要 jQuery :) (2认同)

Ale*_*ing 9

为什么这么复杂?

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

那么这个简短的应该这样做:

calc_date = new Date(Date.now() +(days_to_add * 86400000));
Run Code Online (Sandbox Code Playgroud)

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


Tod*_*odd 8

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

function addDays(days) {
    return new Date(Date.now() + 864e5 * days);
}
Run Code Online (Sandbox Code Playgroud)

  • 这个对我来说最有意义.它简单,优雅,不会为数月/年的问题祈祷. (2认同)

Roh*_*007 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;
Run Code Online (Sandbox Code Playgroud)


Kam*_*ski 8

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

new Date(+yourDate - 30 *86400000)
Run Code Online (Sandbox Code Playgroud)

new Date(+yourDate - 30 *86400000)
Run Code Online (Sandbox Code Playgroud)


Bla*_*lls 7

setDate()的mozilla文档并不表示它将处理月末场景.请参阅https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

设置日期()

  • 根据当地时间设置指定日期的月中某天(1-31).

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


Jos*_*eau 7

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

通过使用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;
}
Run Code Online (Sandbox Code Playgroud)


kpu*_*ll1 6

我使用类似的东西:

new Date(dateObject.getTime() + amountOfDays * 24 * 60 * 60 * 1000)
Run Code Online (Sandbox Code Playgroud)

适用于节省日期的时间:

new Date(new Date(2014, 2, 29, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)
Run Code Online (Sandbox Code Playgroud)

适用于新的一年:

new Date(new Date(2014, 11, 31, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)
Run Code Online (Sandbox Code Playgroud)

它可以参数化:

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);
}
Run Code Online (Sandbox Code Playgroud)


Dun*_*can 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;
};
Run Code Online (Sandbox Code Playgroud)

以上将尊重夏令时.这意味着如果您添加跨越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
Run Code Online (Sandbox Code Playgroud)

如果您希望保留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;
};
Run Code Online (Sandbox Code Playgroud)

那么,现在你有......

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
Run Code Online (Sandbox Code Playgroud)


Vah*_*yan 6

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

timeObject.setDate(timeObject.getDate() + countOfDays);
Run Code Online (Sandbox Code Playgroud)


Mat*_*nta 6

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

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


spa*_*ark 5

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

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

var tomorrow = new Date().addDays(1);
Run Code Online (Sandbox Code Playgroud)

老的:

而不是使用setTime()您可以使用setHours()

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

var tomorrow = new Date().addDays(1);
Run Code Online (Sandbox Code Playgroud)

JSFiddle ...


Ran*_*eer 5

在java脚本中添加日期的非常简单的代码。

var d = new Date();
d.setDate(d.getDate() + prompt('how many days you want to add write here'));
alert(d);
Run Code Online (Sandbox Code Playgroud)


Joh*_*ers 5

有一个setDate和一个getDate方法,它允许你做这样的事情:

var newDate = aDate.setDate(aDate.getDate() + numberOfDays);
Run Code Online (Sandbox Code Playgroud)

如果您想要减去天数并以人类可读的格式格式化您的日期,您应该考虑创建一个DateHelper看起来像这样的自定义对象:

var newDate = aDate.setDate(aDate.getDate() + numberOfDays);
Run Code Online (Sandbox Code Playgroud)

(另见这个小提琴


Cre*_*rge 5

在 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)
Run Code Online (Sandbox Code Playgroud)

这样,如果有一天 Javascript 实现了一个本地addDays方法,你就不会破坏任何东西。