Дата() в js неправильно меняет дни

#javascript #date

Вопрос:

Я хочу увеличивать и уменьшать дни в дате, не меняя другие части даты. Например, когда у меня есть:

  • 31 декабря 2021 года -> добавить один день ->> 01 декабря 2021 года, >>или
  • 01 Декабря 2021 года -> вычтите один день ->> 31 декабря 2021 года

Ниже приведен мой код дня увеличения. Это прекрасно работает, и я получаю то, что хочу:

 let cur_date = new Date();

setInterval(() => {
  let curMonth = cur_date.getMonth();
  cur_date.setDate(cur_date.getDate()   1);
  if (cur_date.getMonth() !== curMonth) {
    cur_date.setMonth(curMonth);
  }
  console.log(cur_date.toLocaleString());
}, 1000);

 

Мой код дня уменьшения не работает, и я получаю 31 December 2021 после 01 November 2021 :

 let cur_date = new Date();

setInterval(() => {
  let curMonth = cur_date.getMonth();
  cur_date.setDate(cur_date.getDate() - 1);
  if (cur_date.getMonth() !== curMonth) {
    cur_date.setMonth(curMonth);
  }
  console.log(cur_date.toLocaleString());
}, 1000);

 

Как это исправить?

Комментарии:

1. Это потому, что в ноябре нет 31 дня, как в октябре.

Ответ №1:

Это происходит потому, что в ноябре нет 31 дня, и поэтому, когда вы возвращаетесь на один день назад с 1 ноября, вы получаете 31 октября. Затем вы меняете месяц так, чтобы это было 31 ноября, но JavaScript интерпретирует это как 30 ноября 1 день = 1 декабря.

Чтобы избежать этого, выполните проверку перед вычитанием одного дня: если дата равна 1, то сначала добавьте месяц, а затем позвольте вычесть 1 день:

 let cur_date = new Date();

setInterval(() => {
  let curMonth = cur_date.getMonth();
  if (cur_date.getDate() === 1) { // Do the check here, before subtracting 1 day
    cur_date.setMonth(curMonth   1); // Go temporary to next month
  }
  cur_date.setDate(cur_date.getDate() - 1);
  console.log(cur_date.toLocaleString());
}, 1000); 

Комментарии:

1. Спасибо, это было очень полезно для меня.

2. Вам нужно будет сделать эту проверку в цикле за 1 февраля -> 31 января ->> 3 марта

3. Почти забыл о маркировке)) Спасибо.

4. @phuzi, нет, в цикле нет необходимости. Ты проверял? Это решение не действует с 1 февраля по 31 января. Пожалуйста, прочтите еще раз.

5. Достаточно справедливо, как и ваше решение лучше 👍 🏻