6 ответов:
С помощью дата объект и его значение миллисекунды, различия могут быть вычислены:
var a = new Date(); // Current date now. var b = new Date(2010, 0, 1, 0, 0, 0, 0); // Start of 2010. var d = (b-a); // Difference in milliseconds.вы можете получить количество секунд (как целое число / целое число), разделив миллисекунды на 1000, чтобы преобразовать его в секунды, а затем преобразовать результат в целое число (это удаляет дробную часть, представляющую миллисекунды):
var seconds = parseInt((b-a)/1000);вы могли бы тогда получить весь
minutesделениеsecondsна 60 и преобразование его в целое число, тоhoursделениеminutesна 60 и преобразование его в целое число, а затем более длинные единицы времени таким же образом. Из этого можно создать функцию для получения максимального полного количества единицы времени в значении нижней единицы и оставшейся нижней единицы:function get_whole_values(base_value, time_fractions) { time_data = [base_value]; for (i = 0; i < time_fractions.length; i++) { time_data.push(parseInt(time_data[i]/time_fractions[i])); time_data[i] = time_data[i] % time_fractions[i]; }; return time_data; }; // Input parameters below: base value of 72000 milliseconds, time fractions are // 1000 (amount of milliseconds in a second) and 60 (amount of seconds in a minute). console.log(get_whole_values(72000, [1000, 60])); // -> [0,12,1] # 0 whole milliseconds, 12 whole seconds, 1 whole minute.Если вам интересно, какие входные параметры приведены выше для второго дата объект см. Их имена ниже:
new Date(<year>, <month>, <day>, <hours>, <minutes>, <seconds>, <milliseconds>);как отмечено в комментариях к этому решению, вы не делаете обязательно нужно предоставить все эти значения, если они не необходимы для даты, которую вы хотите представить.
Я нашел это, и он отлично работает для меня:
вычисление разницы между двумя известными датами
к сожалению, вычисление интервала дат, такого как дни, недели или месяцы между двумя известными датами, не так просто, потому что вы не можете просто добавить объекты даты вместе. Чтобы использовать объект даты в любом виде вычисления, мы должны сначала получить внутреннее значение миллисекунды даты, которое хранится как большое целое число. Функция для этого это дата.метод getTime.)( После того, как обе даты были преобразованы, вычитание более позднего из более раннего возвращает разницу в миллисекундах. Затем желаемый интервал может быть определен путем деления этого числа на соответствующее число миллисекунд. Например, чтобы получить количество дней для заданного количества миллисекунд, мы разделим на 86 400 000, количество миллисекунд в День (1000 x 60 секунд x 60 минут x 24 часа):
Date.daysBetween = function( date1, date2 ) { //Get 1 day in milliseconds var one_day=1000*60*60*24; // Convert both dates to milliseconds var date1_ms = date1.getTime(); var date2_ms = date2.getTime(); // Calculate the difference in milliseconds var difference_ms = date2_ms - date1_ms; // Convert back to days and return return Math.round(difference_ms/one_day); } //Set the two dates var y2k = new Date(2000, 0, 1); var Jan1st2010 = new Date(y2k.getFullYear() + 10, y2k.getMonth(), y2k.getDate()); var today= new Date(); //displays 726 console.log( 'Days since ' + Jan1st2010.toLocaleDateString() + ': ' + Date.daysBetween(Jan1st2010, today));округлении необязательно, в зависимости от того, хотите ли вы частичные дни или нет.
// This is for first date first = new Date(2010, 03, 08, 15, 30, 10); // Get the first date epoch object document.write((first.getTime())/1000); // get the actual epoch values second = new Date(2012, 03, 08, 15, 30, 10); // Get the first date epoch object document.write((second.getTime())/1000); // get the actual epoch values diff= second - first ; one_day_epoch = 24*60*60 ; // calculating one epoch if ( diff/ one_day_epoch > 365 ) // check , is it exceei { alert( 'date is exceeding one year'); }
Если вы ищете разницу, выраженную в виде комбинации лет, месяцев и дней, я бы предложил эту функцию:
function interval(date1, date2) { if (date1 > date2) { // swap var result = interval(date2, date1); result.years = -result.years; result.months = -result.months; result.days = -result.days; result.hours = -result.hours; return result; } result = { years: date2.getYear() - date1.getYear(), months: date2.getMonth() - date1.getMonth(), days: date2.getDate() - date1.getDate(), hours: date2.getHours() - date1.getHours() }; if (result.hours < 0) { result.days--; result.hours += 24; } if (result.days < 0) { result.months--; // days = days left in date1's month, // plus days that have passed in date2's month var copy1 = new Date(date1.getTime()); copy1.setDate(32); result.days = 32-date1.getDate()-copy1.getDate()+date2.getDate(); } if (result.months < 0) { result.years--; result.months+=12; } return result; } // Be aware that the month argument is zero-based (January = 0) var date1 = new Date(2015, 4-1, 6); var date2 = new Date(2015, 5-1, 9); document.write(JSON.stringify(interval(date1, date2)));Это решение будет рассматривать високосные годы (29 февраля) и различия в длине месяца таким образом, как мы, естественно, будем делать (я думаю).
даты с точно таким же месяцем и днем, но разным годом, всегда будут иметь разницу в точном количестве лет. Таким образом, разница между 2015-03-01 и 2016-03-01 будет составлять ровно 1 год, а не 1 год и 1 день (из-за подсчета 365 дней как 1 год).
Date.prototype.addDays = function(days) { var dat = new Date(this.valueOf()) dat.setDate(dat.getDate() + days); return dat; } function getDates(startDate, stopDate) { var dateArray = new Array(); var currentDate = startDate; while (currentDate <= stopDate) { dateArray.push(currentDate); currentDate = currentDate.addDays(1); } return dateArray; } var dateArray = getDates(new Date(), (new Date().addDays(7))); for (i = 0; i < dateArray.length; i ++ ) { // alert (dateArray[i]); date=('0'+dateArray[i].getDate()).slice(-2); month=('0' +(dateArray[i].getMonth()+1)).slice(-2); year=dateArray[i].getFullYear(); alert(date+"-"+month+"-"+year ); }
var DateDiff = function(type, start, end) { let // or var years = end.getFullYear() - start.getFullYear(), monthsStart = start.getMonth(), monthsEnd = end.getMonth() ; var returns = -1; switch(type){ case 'm': case 'mm': case 'month': case 'months': returns = ( ( ( years * 12 ) - ( 12 - monthsEnd ) ) + ( 12 - monthsStart ) ); break; case 'y': case 'yy': case 'year': case 'years': returns = years; break; case 'd': case 'dd': case 'day': case 'days': returns = ( ( end - start ) / ( 1000 * 60 * 60 * 24 ) ); break; } return returns; }использование
ВАР qtMonths = функция datediff('мм', новая дата('2015-05-05'), новая дата());
ВАР qtYears = функция datediff('гг', новая дата('2015-05-05'), новая дата());
ВАР qtDays = функция datediff('ДД', новая дата('2015-05-05'), новая дата());
или
ВАР qtMonths = функция datediff('м', новая дата('2015-05-05'), новая дата()); // М || Г || Д
var qtMonths = DateDiff ('месяц', новая дата('2015-05-05'), новая дата()); // месяц || год || День
ВАР qtMonths = функция datediff('месяцев', новая дата('2015-05-05'), новая дата()); // месяцев || лет || дней
...
var DateDiff = function (type, start, end) { let // or var years = end.getFullYear() - start.getFullYear(), monthsStart = start.getMonth(), monthsEnd = end.getMonth() ; if(['m', 'mm', 'month', 'months'].includes(type)/*ES6*/) return ( ( ( years * 12 ) - ( 12 - monthsEnd ) ) + ( 12 - monthsStart ) ); else if(['y', 'yy', 'year', 'years'].includes(type)) return years; else if (['d', 'dd', 'day', 'days'].indexOf(type) !== -1/*EARLIER JAVASCRIPT VERSIONS*/) return ( ( end - start ) / ( 1000 * 60 * 60 * 24 ) ); else return -1; }
Comments