Як я можу додати 1 день до поточної дати?


93

У мене є поточний об'єкт Date, який потрібно збільшити на один день за допомогою об'єкта JavaScript Date. У мене є такий код:

var ds = stringFormat("{day} {date} {month} {year}", { 
                day: companyname.i18n.translate("day", language)[date.getUTCDay()], 
                date: date.getUTCDate(), 
                month: companyname.i18n.translate("month", language)[date.getUTCMonth()], 
                year: date.getUTCFullYear() 
});

Як я можу додати до нього один день?

Я додав +1 до getUTCDay()і, getUTCDate()але в ньому не відображається "неділя" day, що я очікую.


1
Що ви маєте на увазі під словом "додати +1"? Вам потрібен наступний день чи щось інше?
Aleks G

Хто date: (date.getUTCDate()+1)не працює (працює для мене)? Можливо, виникає конфлікт імен з date(як Date () - Object та як Object-Key. Чи пробували ви викликати Date () - Object different?
Dominik Schreiber

в даний час він відображається лише як: <option value = "2012-04-06"> сб 6 квітня 2012 </option> <option value = "2012-04-07"> 7 квітня 2012 </option>, немає "неділя 7 квітня 2012 "
несамовитий

Отже, це не те, що 7 Aprвам потрібно (те, що для мене - "додати наступного дня"), це Sunday. Не забудьте додати +1і в, day:і date:(або, як згадується в поточній відповіді, раніше).
Домінік Шрайбер,

Відповіді:


238

Щоб додати один день до об’єкта дати:

var date = new Date();

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

Див. Повторне запитання: stackoverflow.com/questions/3674539/… . Ця відповідь хороша, але не враховує літній час. Є 2 дні в році, у яких немає 24 годин.
Джесс

2
@ Джесс - це залежить від того, як ви хочете, щоб зміни були представлені на переході на літній час. На запитання, як додати один до дати, саме це і робить вищевказана відповідь. Додавання 24 годин не обов'язково збільшує цю дату, додавання однієї до локальної дати за допомогою setDate завжди робить.
RobG

Ось що я маю на увазі. Збільшення 10 березня: var a = new Date("2013-03-10T00:00:00.000Z"); a.setDate(a.getDate() + 1); a.toISOString();є "2013-03-10T23:00:00.000Z". Це тонкий випадок, коли вищевказана функція у мене не спрацювала.
Джесс

1
Звичайно, ні! Ви починаєте з UTC-часу, потім по суті перетворюєте його в локальний, додаєте день, а потім перетворюєте назад у UTC. Тож до місцевої дати було додано один день , але лише 23 години UTC-часу. Якщо до дати 1 UTC додати 1, ви отримаєте 01:00:00 за місцевим часом. Ця поведінка не властива лише переходу на літній час, це наслідок використання трьох різних часових поясів.
RobG

8
Ага. Я не підозрював, що getDate переводив з UTC місцевий час. a.setUTCDate(a.getUTCDate() + 1);<- це працює з датами зулу.
Джесс

40

На мою скромну думку, найкращий спосіб - це просто додати повний день в мілісекундах, залежно від того, як ви враховуєте свій код, він може зіпсувати, якщо ваш в останній день місяця.

наприклад 28 лютого або 31 березня.

Ось приклад того, як я це міг би зробити:

var current = new Date(); //'Mar 11 2015' current.getTime() = 1426060964567
var followingDay = new Date(current.getTime() + 86400000); // + 1 day in ms
followingDay.toLocaleDateString();

imo це забезпечує точність

ось ще один приклад. Мені не подобається, що це може працювати для вас, але не настільки чисто, що доза вище

var today = new Date('12/31/2015');
var tomorrow = new Date(today);
tomorrow.setDate(today.getDate()+1);
tomorrow.toLocaleDateString();

imho this === 'POOP'

Отже, деякі з вас погодились на мій мілісекундний підхід через економію світлового дня. Тож я збираюся це розбити. По-перше, у деяких країнах та штатах немає переходу на світловий день. Друге додавання рівно 24 години - це цілий день. Якщо числова доза не змінюється раз на рік, але потім фіксується через 6 місяців, я не бачу там проблем. Але для того, щоб бути певним і мати справу з розподілом злого Date (), я продумав це і зараз до кінця ненавиджу Date. Отже, це мій новий підхід

var dd = new Date(); // or any date and time you care about 
var dateArray =  dd.toISOString().split('T')[0].split('-').concat( dd.toISOString().split('T')[1].split(':') );
// ["2016", "07", "04", "00", "17", "58.849Z"] at Z 

Тепер весела частина!

var date = { 
    day: dateArray[2],
    month: dateArray[1],
    year: dateArray[0],
    hour: dateArray[3],
    minutes: dateArray[4],
    seconds:dateArray[5].split('.')[0],
    milliseconds: dateArray[5].split('.')[1].replace('Z','')
}

тепер у нас є офіційний дійсний міжнародний об’єкт дати, чітко виписаний на меридіані зулу. Тепер змінити дату

  dd.setDate(dd.getDate()+1); // this gives you one full calendar date forward
  tomorrow.setDate(dd.getTime() + 86400000);// this gives your 24 hours into the future. do what you want with it.

Додавання секунд / мілісекунд не буде працювати для переходу на літній час.
Matt H

@Matt H, звідки ти взяв цю ідею. Час встановлюється в UTC в мілісекундах з 01.01.1970 р.
Петро Росіянин

1
Так буде наступного дня за UTC-часом, але не обов’язково за місцевим часом. У день весняного вперед у США 25 годин на день. Отже, якщо у вас є, наприклад, 31.03.15 о 00:00 годині, і ви додасте 86400000 мілісекунд, у день Sprint Forward місцевий час буде 31.03.15 о 23:00, оскільки в цей день 25 годин.
Matt H

3
ефект можна побачити так:var dte = Date.parse('2015-11-01'); console.log(dte); dte.setTime(dte.getTime() + 86400000 ); console.log(dte);
Matt H

1
Це надмірно розроблено. Якщо у вас є така проблема, скористайтеся бібліотекою, як-от момент або щось інше, щоб полегшити ситуацію.
Джошуа Майкл Вагонер,


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


Не вдається додати один день мілісекунд, оскільки не всі дні займають 24 години в місцях, де спостерігається перехід на літній час. Наприклад, Чилі закінчується переходом на літній час опівночі на початку 14 травня 2017 року. Годинники накрутяться з опівночі до 23:00. Тож додавання 24 годин до 2017-05-13 00:00:00 призведе до 2017-05-13 23:00:00, і дата не зміниться (деякі браузери роблять це рівно опівночі, інші через одну мілісекунду) . :-(
RobG

2

Натхненний jpmottin у цьому питанні , ось код одного рядка:

var dateStr = '2019-01-01';
var days = 1;

var result = new Date(new Date(dateStr).setDate(new Date(dateStr).getDate() + days));

document.write('Date: ', result); // Wed Jan 02 2019 09:00:00 GMT+0900 (Japan Standard Time)
document.write('<br />');
document.write('Trimmed Date: ', result.toISOString().substr(0, 10)); // 2019-01-02

Сподіваюся, це допомагає


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.