Добавить дни к дате JavaScript

Как добавить дни к текущей Дате с помощью JavaScript. Есть ли в JavaScript встроенная функция, подобная .Net'у AddDay?

Вы можете создать его с помощью:-

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 как изменяемый класс, а не как неизменяемую структуру.

Комментарии (16)

Правильный Ответ:

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][1]

в

// 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>

в

Комментарии (18)
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);

Будьте осторожны, потому что это может быть сложно. При установке "завтра", это работает только потому, что текущее значение совпадает с годом и месяцем для "сегодня". Однако, установка на число даты, такое как "32", обычно срабатывает, чтобы переместить его на следующий месяц.

Комментарии (7)

Мое простое решение:

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

данное решение не иметь проблем с переходом на летнее время. Кроме того, можно добавить/суб любого смещения для лет, месяцев, дней и т. д.

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

это правильный код.

Комментарии (7)

Эти ответы кажутся мне запутанными, я предпочитаю:

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

getTime() дает нам миллисекунды с 1970 года, а 86400000 - это количество миллисекунд в сутках. Следовательно, ms содержит миллисекунды для нужной даты.

Использование конструктора millisecond дает нужный объект даты.

Комментарии (4)

Попробовать

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

Через setDate (), чтобы добавить дату не решить вашу проблему, попробуйте добавить несколько дней до февраля месяца, если вы пытаетесь добавить нового дня, она бы не привести к тому, что вы ожидали.

Комментарии (5)

Просто непонятно, что дело было с год не добавляя при следовании привести примеры ниже.

Если вы хотите просто добавить N дней до даты вы-лучшая:

myDate.setDate(myDate.функции getdate() + Н);

или обширный версии

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

Сегодня/завтра вещи путаете. Установка текущей даты в новой даты переменной будет испортить году. если вы работаете с первоначальной даты вы выиграли'т.

Комментарии (1)

Если вы можете, использовать moment.js. В JavaScript не'т иметь очень хороший родной дата/время методов. Ниже приведен пример момент'синтаксис с:

в

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/

Комментарии (9)
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);

в

Комментарии (4)

Я создал эти расширения прошлой ночью: вы можете пройти либо положительные или отрицательные значения;

пример:

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;
}
Комментарии (3)

Самым простым решением.

в

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

в

Комментарии (2)

Без использования второй переменной, вы можете заменить 7 следующего х дней:

let d=new Date(new Date().getTime() + (7 * 24 * 60 * 60 * 1000));
Комментарии (0)

Спасибо Джейсон за ваш ответ, который работает как ожидалось, вот-это смесь из кода и удобный формат AnthonyWJones :

Date.prototype.addDays = function(days){
    var ms = new Date().getTime() + (86400000 * days);
    var added = new Date(ms);
    return added;
}
Комментарии (2)

Старый я знаю, но иногда мне нравится этот:

function addDays(days) {
    return new Date(Date.now() + 864e5 * days);
}
Комментарии (4)

Опоздал на вечеринку, но <удар>но если вы используете библиотека jQuery то</удара> там's превосходный плагин, который называется Момент:

http://momentjs.com/

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

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

И много других хороших вещей там!

Редактировать: на jQuery ссылка удалена спасибо aikeru'ы комментарий

Комментарии (5)

Вы можете использовать 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;
Комментарии (0)

Я использую что-то вроде:

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);
}
Комментарии (0)

В Mozilla Docs для setDate() Дон'т указать, что он будет обрабатывать конец месяца сценариев. См. https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

setDate()

  • Устанавливает день месяца (1-31) для указанной даты по местному времени.

Именно поэтому я использую setTime (), когда мне нужно добавить дней.

Комментарии (2)

Нет, в JavaScript нет встроенной функции, но вы можете использовать простую строку кода

timeObject.setDate(timeObject.getDate() + countOfDays);
Комментарии (0)

Я думаю, что я'МР дать ответ, а также:<БР/> Лично мне нравится, чтобы попытаться избежать безвозмездное объявление переменной, метод звонками и вызова конструктора, так как все они дороже по производительности. (в пределах разумного, конечно)<БР/> Я собираюсь оставить это как просто комментарий под ответом @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;
};

Выше будет уважать ДСТ. То есть, если вы добавить количество дней, которые пересекают переход на летнее время, отображается время (час) изменится, чтобы отразить это.<БР/> Пример:<БР/> 2 ноября 2014 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

Если вы'вновь глядя сохранить время на летнее время (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
Комментарии (0)