Функция пытается финансировать разницу между датами, но я изо всех сил стараюсь не возвращать отрицательное число, если дата прошла мимо определенной точки. Я пробовал несколько работ, как использование ABS, но это может вызвать проблемы в будущих областях.Как заставить эту функцию не возвращать отрицательную дату?
var DateCalc = {};
DateCalc.totalDaysLeft = 0;
DateCalc.calculate = function(dateToParse) {
DateCalc.init(dateToParse);
return DateCalc.stringify(DateCalc.years(), DateCalc.months(), DateCalc.days());
};
DateCalc.init = function(dateToParse) {
var date = DateCalc.parseDate(dateToParse);
var today = Date.now();
var oneDay = 24 * 60 * 60 * 1000;
DateCalc.totalDaysLeft = Math.floor((date - today)/oneDay);
};
DateCalc.parseDate = function(dateToParse) {
var dateVars = dateToParse.split(',').map(Number);
return new Date(dateVars[0], dateVars[1] - 1, dateVars[2]);
};
DateCalc.years = function() {
var years = Math.floor(DateCalc.totalDaysLeft/365);
DateCalc.totalDaysLeft -= Math.floor(years * 365);
return years;
};
DateCalc.months = function() {
var months = Math.floor(DateCalc.totalDaysLeft/30);
DateCalc.totalDaysLeft -= Math.floor(months * 30);
return months;
};
DateCalc.days = function() {
return Math.floor(DateCalc.totalDaysLeft/24);
};
DateCalc.stringify = function(years, months, days) {
var dateString = "";
if (years !== 0)
dateString += years + " years, ";
if (months !== 0)
dateString += months + " months, ";
dateString += days + " day(s).";
return dateString;
};
//here is the .abs() code.
function age(year, month, day) {
var yearDifference = Math.abs(new Date().getFullYear() - year);
var monthDifference = Math.abs(new Date().getMonth() - month + 1);
var dayDifference = Math.abs(new Date().getDate() - day);
var differences = {
year: yearDifference,
month: monthDifference,
day: dayDifference
};
var final = [];
for (var time in differences) {
if (differences[time] > 0) {
var addString = differences[time] + " " + time;
if (differences[time] > 1) {
addString += "s"
}
final.push(addString);
}
}
return final.join(" ");
};
console.log(age(2017, 11, 17));
console.log(age(2016, 1, 2));
// если вы пытались посмотреть, как далеко в январе следующего года в то время как вы находитесь в декабре, он расскажет вам, что 1 год 11 месяцев теперь вместо 1 месяц , Это потому, что он добавляет 11 месяцев вместо того, чтобы вычитать его. Я пытаюсь найти решение, поскольку эта функция более узкая, а другая - более универсальная. Функция выше, я заменил .floor() раундами значение вниз с .abs(), надеясь, что он просто будет использовать абсолютное значение данной операции, однако это было не так.
использовать 'Math.abs (num)', чтобы получить абсолютное значение –
Не могли бы вы вывести несколько примеров ожидаемого результата? – Amnon
Я пробовал использовать Math.abs (num), однако мне сказали: «Метод абсолютного значения имеет ошибки, которые становятся более заметными по мере того, как год продолжается. Например, если вы попытались посмотреть, как далеко в следующем январе, re в декабре, он скажет вам, что через 1 месяц 11 месяцев вместо 1 месяца это будет 1 год, потому что он добавляет 11 месяцев вместо вычитания. Фактически вы можете увидеть эту ошибку в работе сейчас, пытаясь получить сумму времени до декабря прошлого года ». – thecommunictycodeguy