У меня есть форма, где я принимаю продолжительность. Это может быть месяц, год, 2 месяца, 20 дней и т. Д.
На основании этой продолжительности отправляется электронное письмо всем детям, у которых есть дни рождения x дней до этой продолжительности.
Поскольку человек может родиться в месяц с 28, 29, 30 или 31 днем, это делает расчет разницы дат болезненным.
То, что я сделал до сих пор, преобразовано в месяцы -> 30 дней, годы -> 365 дней, и на основе этого я сделал свои вычисления.
Что может быть более элегантным способом справиться с такими динамическими различиями дат, учитывая разные месяцы и високосные годы?
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 для удобства.
Обратите внимание, что арифметика даты не обязательно симметрична.
Вы можете просто использовать 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);
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Обратите внимание, что JavaScript — это НЕ Java. Включите все теги, относящиеся к вашему вопросу: например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [стройный] и т. д.