Збільшення дати в JavaScript


433

Мені потрібно збільшити значення дати на один день у JavaScript.

Наприклад, у мене є дата дати 2010-09-11, і мені потрібно зберігати дату наступного дня у змінній JavaScript.

Як я можу збільшити побачення за день?


Чи відповідає це на ваше запитання? Додайте дні до дати JavaScript
Michael Freidgeim

Відповіді:


791

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

1. Використання просто Dateоб’єкта JavaScript (без бібліотек):

Моя попередня відповідь №1 була помилковою (вона додала 24 години, не враховуючи переходів до та з літнього часу; Клівер Люд зазначив, що це не вдасться 7 листопада 2010 року у східному часовому поясі). Натомість відповідь Джигара - це правильний спосіб зробити це без бібліотеки:

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

Це працює навіть останній день місяця (або року), оскільки об’єкт дати JavaScript розумний щодо перекидання:

(Ця відповідь наразі прийнята, тому я не можу її видалити. Перш ніж вона була прийнята, я запропонував ОП прийняти Джигар, але, можливо, вони прийняли цю для пунктів №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 ("arrival_date"). Значення, воно показує недійсну дату
Сантану

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

Я просто хотів додати секунду до екземпляра дати; це працювало для мене x = new Date(); x2 = new Date(x.getTime() + 1000), де 1000 - це приріст мілісекунд.
berto

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 ("arrival_date"). Значення, воно показує недійсну дату
Сантану

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 місяці значення перерахувань (січень рівним 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(), насправді.
Полв

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 Наріжте дату з поверненої дати значення, а потім приріст на потрібну кількість днів.

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

Не повністю впевнений, що це BUG (випробуваний Firefox 32.0.3 та Chrome 38.0.2125.101), але наступний код не вдасться в Бразилії (-3 GMT):

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

Результати в рядковому поданні завтрашньої дати. Використовуйте новий 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.