1. У меня есть форма, где я принимаю продолжительность. Это может быть месяц, год, 2 месяца, 20 дней и т. Д.

  2. На основании этой продолжительности отправляется электронное письмо всем детям, у которых есть дни рождения x дней до этой продолжительности.

  3. Поскольку человек может родиться в месяц с 28, 29, 30 или 31 днем, это делает расчет разницы дат болезненным.

  4. То, что я сделал до сих пор, преобразовано в месяцы -> 30 дней, годы -> 365 дней, и на основе этого я сделал свои вычисления.

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

0
Akshay Khetrapal 8 Сен 2016 в 08:40

2 ответа

Лучший ответ

Добавить дни, месяцы и годы довольно просто. При добавлении месяцев просто убедитесь, что дата в новом месяце совпадает с начальным месяцем, и, если это не так, установите дату на 0 (т. Е. Вы пролонгировали дополнительный месяц, поэтому установите дату в конец предыдущий месяц). То же самое для добавления лет, но это произойдет только в феврале. Например.

function addMonths(date, months) {
  var d = new Date(+date);
  var startDate = d.getDate();
  d.setMonth(d.getMonth() + months);
  if (d.getDate() != startDate) d.setDate(0);
  return d;
}

function addYears(date, years) {
  return addMonths(date, years * 12);
}

var d = new Date(2016,4,31);
console.log(d.toLocaleString() + ' plus one month is \n' +
            addMonths(d,1).toLocaleString());

d = new Date(2016,1,29);
console.log(d.toLocaleString() + ' plus one year is \n' + 
            addYears(d, 1).toLocaleString());

Вы можете даже добавить их как методы в Date.prototype для удобства.

Обратите внимание, что арифметика даты не обязательно симметрична.

1
RobG 8 Сен 2016 в 05:56

Вы можете просто использовать Vanilla JS для этого -

Месяцами -

var d = new Date();
d.setMonth(d.getMonth() - x);

Годами -

var d = new Date();
d.setYear(d.getYear() - x);

Несколько дней -

var d = new Date();
d.setDate(d.getDate() - x);
1
naortor 8 Сен 2016 в 06:05