Увеличение даты в JavaScript


433

Мне нужно увеличить значение даты на один день в JavaScript.

Например, у меня есть значение даты 2010-09-11, и мне нужно сохранить дату следующего дня в переменной JavaScript.

Как я могу увеличить дату на день?


Отвечает ли это на ваш вопрос? Добавить дни в JavaScript Дата
Майкл Фрейдгейм

Ответы:


792

Три варианта для вас:

1. Используя только Dateобъект JavaScript (без библиотек):

Мой предыдущий ответ на вопрос № 1 был неправильным (он добавил 24 часа, не учитывая переходы на летнее время и обратно; Clever Human указал, что он потерпит неудачу с 7 ноября 2010 года в восточном часовом поясе). Вместо этого ответ Jigar - правильный способ сделать это без библиотеки:

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

Это работает даже в последний день месяца (или года), потому что объект даты в JavaScript хорош для ролловера:

(Этот ответ в настоящее время принят, поэтому я не могу удалить его. Прежде чем он был принят, я предложил ОП, чтобы они приняли Jigar, но, возможно, они приняли этот для пунктов № 2 или № 3 в списке.)

2. Использование MomentJS :

var today = moment();
var tomorrow = moment(today).add(1, 'days');

(Остерегайтесь того, что он addизменяет экземпляр, который вы вызываете, вместо того, чтобы возвращать новый экземпляр, поэтому today.add(1, 'days')измените его today. Вот почему мы начинаем с операции клонирования var tomorrow = ....)

3. Использование DateJS , но оно не обновлялось долгое время:

var today = new Date(); // Or Date.today()
var tomorrow = today.add(1).day();

Но у меня есть дата 2010-09-11 в переменной с использованием document.getElementById ("прибытие_даты"). Значение, оно показывает недопустимую дату
Сантану

1
@santanu: Это совершенно другая проблема: анализ даты (получение даты путем интерпретации строки). Если этот формат является статическим, вы можете разобрать его самостоятельно и передать результаты в Dateконструктор ( new Date(year, month, date)); см. раздел 15.9.2.1 спецификации ; если вы хотите принять ряд форматов, обязательно посмотрите на DateJS .
TJ Crowder

1
@santanu: Просто для того, чтобы следовать вышеизложенному: некоторые браузеры могут успешно анализировать этот формат Date.parse(который возвращает количество миллисекунд, которые вы можете затем передать new Date(ms)). Но будьте осторожны, это может варьироваться от браузера к браузеру. До недавнего времени реализации могли делать практически все, что хотели Date.parse. Новая спецификация 5-го издания теперь имеет минимальный формат, который должен быть принят, но я бы пока на это не рассчитывал.
TJ Crowder

Я просто хотел добавить секунду в экземпляр Date; это сработало для меня x = new Date(); x2 = new Date(x.getTime() + 1000), где 1000 - это приращение в миллисекунду.
Берто

1
@piavgh: Нет ничего плохого в первом решении, просто в том, как вы его используете. Dateобъекты изменчивы. Вы храните один и тот же Date объект три раза в массиве. Если вы хотите три разных Dateобъекта, вы должны создать три объекта:var unavailableDates = []; for (var d = new Date('2017-05-11'); d < new Date('2017-05-13'); d.setDate(d.getDate() + 1)) { unavailableDates.push(new Date(+d)); }
TJ Crowder

178
var myDate = new Date();

//add a day to the date
myDate.setDate(myDate.getDate() + 1);

Но у меня есть дата 2010-09-11 в переменной с использованием document.getElementById ("прибытие_даты"). Значение, оно показывает недопустимую дату
Сантану

1
@sanatu: В этом случае вам нужно отформатировать строку так, чтобы ее мог принять браузер. Chrome принимает, new Date("2009-09-11")а Firefox - нет. Я думаю, что большинство браузеров согласны с new Date("2009/09/11")таким простым решением var arrivalDate = document.getElementById('arival_date').value; var dayAfter = new Date(arrival_date.replace(/-/g, '/')); dayAfter.setDate(dayAfter.getDate()+1);.
Дэвид Хедлунд

5
Более надежный подход, чем замена -на /и надежда на то, что браузеры примут его, состоял бы в том, чтобы разделить строку на части: var dateParts = arrivalDate.split('-'); var y = parseInt(dateParts[0], 10); var m = parseInt(dateParts[1], 10); var d = parseInt(dateParts[2], 10); var dayAfter = new Date(y, m-1, d+1);обратите внимание, что мы используем m-1здесь, потому что месяцы javascript - это значения enum (январь равен 0, а не 1), и d+1потому что мы выполняем приращение уже в начальном назначении (оно будет автоматически исправлено 29 февраля и т. д.)
Дэвид Хедлунд

35

Кажется, что ни один из примеров в этом ответе не работает с днями перехода на летнее время. В эти дни количество часов в дне не 24 (это 23 или 25, в зависимости от того, «прыгаете ли вы вперед» или «отступаете»).

Приведенная ниже функция JavaScript AddDays учитывает переход на летнее время:

function addDays(date, amount) {
  var tzOff = date.getTimezoneOffset() * 60 * 1000,
      t = date.getTime(),
      d = new Date(),
      tzOff2;

  t += (1000 * 60 * 60 * 24) * amount;
  d.setTime(t);

  tzOff2 = d.getTimezoneOffset() * 60 * 1000;
  if (tzOff != tzOff2) {
    var diff = tzOff2 - tzOff;
    t += diff;
    d.setTime(t);
  }

  return d;
}

Вот тесты, которые я использовал для проверки функции:

    var d = new Date(2010,10,7);
    var d2 = AddDays(d, 1);
    document.write(d.toString() + "<br />" + d2.toString());

    d = new Date(2010,10,8);
    d2 = AddDays(d, -1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

    d = new Date('Sun Mar 27 2011 01:59:00 GMT+0100 (CET)');
    d2 = AddDays(d, 1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

    d = new Date('Sun Mar 28 2011 01:59:00 GMT+0100 (CET)');
    d2 = AddDays(d, -1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

33

Самый простой способ - преобразовать в миллисекунды и добавить 1000 * 60 * 60 * 24 миллисекунд, например:

var tomorrow = new Date(today.getTime()+1000*60*60*24);

Я люблю это, целочисленное правило представления.
exebook

Это лучший ответ. Может легко увеличивать / уменьшать столько дней, сколько требуется; просто умножением 1000*60*60*24хDaysToBeAdded
Халил Халаф

Или, new Date(+new Date() + 1000*60*60*24)но на самом деле это похоже на getTime()/ setTime(), на самом деле.
Polv

1
Не делайте этого, если ваша дата не в UTC или другом часовом поясе, где нет летнего времени. В противном случае на 2 дня в году это даст неожиданные результаты.
ItalyPaleAle

new Date(Date.now()+1000*60*60*24);
Однострочник

28

Завтра в одной строке в чистом JS, но это безобразно !

new Date(new Date().setDate(new Date().getDate() + 1))

Вот результат:

Thu Oct 12 2017 08:53:30 GMT+0200 (Romance Summer Time)

14

Сначала вам нужно проанализировать вашу строку, прежде чем следовать советам других людей:

var dateString = "2010-09-11";
var myDate = new Date(dateString);

//add a day to the date
myDate.setDate(myDate.getDate() + 1);

Если вы хотите вернуть его в тот же формат, вам придется сделать это «вручную»:

var y = myDate.getFullYear(),
    m = myDate.getMonth() + 1, // january is month 0 in javascript
    d = myDate.getDate();
var pad = function(val) { var str = val.toString(); return (str.length < 2) ? "0" + str : str};
dateString = [y, pad(m), pad(d)].join("-");

Но я предлагаю получить Date.js , как указано в других ответах, которые помогут вам много .


7

Я чувствую, что нет ничего безопаснее, чем .getTime()и .setTime(), так что это должно быть лучше, а также производительность.

const d = new Date()
console.log(d.setTime(d.getTime() + 1000 * 60 * 60 * 24)) // MILLISECONDS

.setDate() Недопустимая дата (например, 31 + 1) слишком опасна и зависит от реализации браузера.


5

Получение следующих 5 дней:

var date = new Date(),
d = date.getDate(),
m = date.getMonth(),
y = date.getFullYear();


for(i=0; i < 5; i++){
var curdate = new Date(y, m, d+i)
console.log(curdate)
}

Пробовал приведенные выше ответы, но тщетно. Ваш код работал как шарм. Спасибо!
Диммат

4

Два метода:

1:

var a = new Date()
// no_of_days is an integer value
var b = new Date(a.setTime(a.getTime() + no_of_days * 86400000)

2: аналогично предыдущему методу

var a = new Date()
// no_of_days is an integer value
var b = new Date(a.setDate(a.getDate() + no_of_days)

2

Получить строковое значение даты , используя dateObj.toJSON () метод Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON Slice дату с возвращаемым значение, а затем увеличить на количество дней, которые вы хотите.

var currentdate = new Date();
currentdate.setDate(currentdate.getDate() + 1);
var tomorrow = currentdate.toJSON().slice(0,10);

Date.toJSON использует часовой пояс UTC stackoverflow.com/questions/11382606/…
AndreyP

2
 Date.prototype.AddDays = function (days) {
    days = parseInt(days, 10);
    return new Date(this.valueOf() + 1000 * 60 * 60 * 24 * days);
}

пример

var dt = new Date();
console.log(dt.AddDays(-30));
console.log(dt.AddDays(-10));
console.log(dt.AddDays(-1));
console.log(dt.AddDays(0));
console.log(dt.AddDays(1));
console.log(dt.AddDays(10));
console.log(dt.AddDays(30));

Результат

2017-09-03T15:01:37.213Z
2017-09-23T15:01:37.213Z
2017-10-02T15:01:37.213Z
2017-10-03T15:01:37.213Z
2017-10-04T15:01:37.213Z
2017-10-13T15:01:37.213Z
2017-11-02T15:01:37.213Z

Ваш код не работает. Я попробовал это с первым console.log (), и он говорит: dt.AddDays () не является функцией.
Adrian2895

1

Не совсем уверен, что это ошибка (протестировано Firefox 32.0.3 и Chrome 38.0.2125.101), но следующий код не будет работать в Бразилии (-3 по Гринвичу):

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

$date = new Date(2014, 9, 16,0,1,1);
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");

Результат:

Fri Oct 17 2014 00:01:01 GMT-0300
Sat Oct 18 2014 00:01:01 GMT-0300
Sat Oct 18 2014 23:01:01 GMT-0300
Sun Oct 19 2014 23:01:01 GMT-0200

Добавление одного часа к дате, заставит его работать отлично (но не решит проблему).

$date = new Date(2014, 9, 16,0,1,1);

Результат:

Fri Oct 17 2014 01:01:01 GMT-0300
Sat Oct 18 2014 01:01:01 GMT-0300
Sun Oct 19 2014 01:01:01 GMT-0200
Mon Oct 20 2014 01:01:01 GMT-0200

1

Результатом является строковое представление завтрашней даты. Используйте new Date (), чтобы получить сегодняшнюю дату, добавив один день, используя Date.getDate () и Date.setDate (), и преобразовав объект Date в строку.

  const tomorrow = () => {
      let t = new Date();
      t.setDate(t.getDate() + 1);
      return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(
        t.getDate()
      ).padStart(2, '0')}`;
    };
    tomorrow();

1

Увеличение даты года с ванильным js:

start_date_value = "01/01/2019"
var next_year = new Date(start_date_value);
next_year.setYear(next_year.getYear() + 1);
console.log(next_year.getYear()); //=> 2020

На всякий случай, если кто-то хочет увеличить другое значение, кроме даты (дня)


1

Через нативный JS, чтобы добавить один день, вы можете сделать следующее:

let date = new Date(); // today
date.setDate(date.getDate() + 1) // tomorrow

Другой вариант - использовать momentбиблиотеку:

const date = moment().add(14, "days").toDate()

1
Пожалуйста, объясните, что делает этот код. Добавьте подробности о том, как это решает проблему ОП.
Яш

1

Увеличение даты с учетом часового пояса / перехода на летнее время для дат JavaScript:

function nextDay(date) {
    const sign = v => (v < 0 ? -1 : +1);
    const result = new Date(date.getTime());
    result.setDate(result.getDate() + 1);
    const offset = result.getTimezoneOffset();
    return new Date(result.getTime() + sign(offset) * offset * 60 * 1000);
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.