Как найти разницу между двумя датами?
Разница между датами в JavaScript
Ответы (6)
Используя объект Date и его значение в миллисекундах, можно рассчитать разницу:
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.
Если вам интересно, какие входные параметры указаны выше для второго объекта Date, см. их имена ниже:
new Date(<year>, <month>, <day>, <hours>, <minutes>, <seconds>, <milliseconds>);
Как отмечено в комментариях к этому решению, вам не обязательно указывать все эти значения, если только они не необходимы для даты, которую вы хотите представить.
Date
со всеми аргументами, вы можете вызывать его только с годом и месяцем, остальные аргументы необязательны.
- person Christian C. Salvadó; 28.12.2009
b
на самом деле 2009-12-31, поскольку 0
использовалось в качестве аргумента дня, это может как-то сбить с толку новичка...
- person Christian C. Salvadó; 28.12.2009
Я нашел это, и это отлично работает для меня:
Вычисление разницы между двумя известными датами
К сожалению, вычисление интервала дат, такого как дни, недели или месяцы, между двумя известными датами не так просто, потому что вы не можете просто сложить объекты Date вместе. Чтобы использовать объект Date в любом виде вычислений, мы должны сначала получить внутреннее значение Date в миллисекундах, которое хранится в виде большого целого числа. Для этого используется функция Date.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));
Округление не является обязательным, в зависимости от того, хотите ли вы неполные дни или нет.
Если вы ищете разницу, выраженную в виде комбинации лет, месяцев и дней, я бы предложил эту функцию:
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 февраля) и разницу в длине месяцев так, как мы это сделали бы естественным образом (я думаю).
Так, например, интервал между 28 февраля 2015 года и 28 марта 2015 года будет считаться ровно одним месяцем, а не 28 днями. Если оба эти дня приходятся на 2016 год, разница все равно будет ровно в один месяц, а не в 29 дней.
Даты с одним и тем же месяцем и днем, но с разным годом всегда будут иметь разницу в точное количество лет. Таким образом, разница между 01.03.2015 и 01.03.2016 будет ровно 1 год, а не 1 год и 1 день (из-за того, что 365 дней считаются за 1 год).
Этот ответ, основанный на другом (ссылка в конце), касается разницы между двумя датами.
Вы можете увидеть, как это работает, потому что это просто, а также включает разбиение разницы на
единицы времени (функция что я сделал) и преобразование в UTC, чтобы решить проблемы с часовым поясом.
function date_units_diff(a, b, unit_amounts) {
var split_to_whole_units = function (milliseconds, unit_amounts) {
// unit_amounts = list/array of amounts of milliseconds in a
// second, seconds in a minute, etc., for example "[1000, 60]".
time_data = [milliseconds];
for (i = 0; i < unit_amounts.length; i++) {
time_data.push(parseInt(time_data[i] / unit_amounts[i]));
time_data[i] = time_data[i] % unit_amounts[i];
}; return time_data.reverse();
}; if (unit_amounts == undefined) {
unit_amounts = [1000, 60, 60, 24];
};
var utc_a = new Date(a.toUTCString());
var utc_b = new Date(b.toUTCString());
var diff = (utc_b - utc_a);
return split_to_whole_units(diff, unit_amounts);
}
// Example of use:
var d = date_units_diff(new Date(2010, 0, 1, 0, 0, 0, 0), new Date()).slice(0,-2);
document.write("In difference: 0 days, 1 hours, 2 minutes.".replace(
/0|1|2/g, function (x) {return String( d[Number(x)] );} ));
Как работает мой код выше
Разницу между датой и временем в миллисекундах можно рассчитать с помощью объекта Date:
var a = new Date(); // Current date now.
var b = new Date(2010, 0, 1, 0, 0, 0, 0); // Start of 2010.
var utc_a = new Date(a.toUTCString());
var utc_b = new Date(b.toUTCString());
var diff = (utc_b - utc_a); // The difference as milliseconds.
Затем, чтобы вычислить количество секунд в этой разнице, разделите его на 1000, чтобы преобразовать
миллисекунды в секунды, а затем измените результат на целое число (целое число), чтобы удалить
миллисекунды (дробная часть этого десятичного числа). : var seconds = parseInt(diff/1000)
.
Кроме того, я мог бы получить более длинные единицы времени, используя тот же процесс, например:
- (целые) минуты, разделив секунды на 60. и изменить результат на целое число,
- часы, разделить минуты на 60 и изменить результат на целое число.
Я создал функцию для выполнения этого процесса разбиения разницы на целые
единицы времени, названную split_to_whole_units
, с помощью этой демонстрации:
console.log(split_to_whole_units(72000, [1000, 60]));
// -> [1,12,0] # 1 (whole) minute, 12 seconds, 0 milliseconds.
Этот ответ основан на этом другом.
Вы также можете использовать его
export function diffDateAndToString(small: Date, big: Date) {
// To calculate the time difference of two dates
const Difference_In_Time = big.getTime() - small.getTime()
// To calculate the no. of days between two dates
const Days = Difference_In_Time / (1000 * 3600 * 24)
const Mins = Difference_In_Time / (60 * 1000)
const Hours = Mins / 60
const diffDate = new Date(Difference_In_Time)
console.log({ date: small, now: big, diffDate, Difference_In_Days: Days, Difference_In_Mins: Mins, Difference_In_Hours: Hours })
var result = ''
if (Mins < 60) {
result = Mins + 'm'
} else if (Hours < 24) result = diffDate.getMinutes() + 'h'
else result = Days + 'd'
return { result, Days, Mins, Hours }
}
результаты в {результат: '30d', дней: 30, минут: 43200, часов: 720}
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;
}
использование
var qtMonths = DateDiff('мм', новая дата('2015-05-05'), новая дата());
var qtYears = DateDiff('yy', новая дата('2015-05-05'), новая дата());
var qtDays = DateDiff('dd', новая дата('2015-05-05'), новая дата());
OR
var qtMonths = DateDiff('m', новая дата('2015-05-05'), новая дата()); // м || у || г
var qtMonths = DateDiff('месяц', новая дата('2015-05-05'), новая дата()); // месяц || год || день
var 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;
}