Pregunta

¿Cómo encontrar la diferencia entre dos fechas?

¿Fue útil?

Solución

Al utilizar el href="http://www.w3schools.com/jsref/jsref_obj_date.asp" rel="noreferrer"> Fecha objeto y sus milisegundos valor

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.

Se puede obtener el número de segundos (como / número entero entero) dividiendo los milisegundos por 1000 para convertirlo en segundos después convertir el resultado a un número entero (esto elimina la parte fraccionaria que representa los milisegundos):

var seconds = parseInt((b-a)/1000);

A continuación, podría conseguir minutes toda dividiendo por 60 seconds y convertirlo en un entero, entonces hours dividiendo por 60 minutes y convertirlo en un entero, unidades de tiempo más largos a continuación, de la misma manera. A partir de esto, una función para obtener la máxima cantidad entera de una unidad de tiempo en el valor de una unidad inferior y el resto unidad inferior se puede crear:

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.

Si se pregunta qué los parámetros de entrada proporcionados anteriormente para la segunda objeto Date son, ver sus nombres a continuación:

new Date(<year>, <month>, <day>, <hours>, <minutes>, <seconds>, <milliseconds>);

Como se señaló en los comentarios de esta solución, que no necesariamente tiene que proporcionar todos estos valores a menos que sean necesarios para la fecha que desea representar.

Otros consejos

he encontrado esto y funciona bien para mí:

calculando la diferencia entre dos fechas conocidos

Por desgracia, el cálculo de un intervalo de la fecha, tales como días, semanas o meses entre dos fechas conocidas no es tan fácil porque no se puede simplemente añadir objetos Date juntos. Para utilizar un objeto Date en cualquier tipo de cálculo, hay que recuperar primer valor de milisegundos interno de la fecha, que se almacena como un entero grande. La función de hacerlo es date.getTime (). Una vez que ambas fechas se han convertido, restando la posterior de la anterior devuelve la diferencia en milisegundos. El intervalo deseado se puede determinar dividiendo ese número por el número correspondiente de milisegundos. Por ejemplo, para obtener el número de días para un número dado de milisegundos, tendríamos dividir por 86400000, el número de milisegundos en un día (1000 x 60 segundos x 60 minutos x 24 horas):

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));

El redondeo es opcional, dependiendo de si desea días parciales o no.

Referencia

    // 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');
    }

Si usted está buscando una diferencia expresada como una combinación de años, meses y días, sugeriría esta función:

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)));

Esta solución va a tratar los años bisiestos (29 de febrero) y las diferencias de longitud mes de manera natural nos hacer (creo).

Así, por ejemplo, el intervalo entre el 28 de febrero de el año 2015 y 28 de marzo 2015 no se considera exactamente un mes, no 28 días. Si ambos son esos días en el año 2016, la diferencia seguirá siendo exactamente un mes, no 29 días.

Las fechas con exactamente el mismo mes y el día, pero el año diferente, siempre tendrá una diferencia de un número exacto de años. Así que la diferencia entre el 03/01/2015 y el 03/01/2016 será exactamente 1 año, no el 1 año y 1 día (debido a los 365 días a contar como 1 año).

Esta respuesta, basada en otro (enlace al final), se trata de la diferencia entre dos fechas.
Se puede ver cómo funciona porque es simple, también se incluye la división de la diferencia en
unidades de tiempo (una función que hice) y la conversión a UTC a los problemas de la zona de tiempo de parada.

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)] );} ));

¿Cómo mi código de arriba funciona

A diferencia de fecha / hora, como milisegundos, se puede calcular utilizando la Fecha objeto:

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.

Luego de resolver el número de segundos en esa diferencia, se divide por 1000 para convertir
milisegundos a segundos, a continuación, cambiar el resultado a un número entero (número entero) para eliminar
los milisegundos (parte fracción de esa decimal):. var seconds = parseInt(diff/1000)
También, podría conseguir unidades más largos de tiempo utilizando el mismo proceso, por ejemplo:
 - (conjunto) minutos , dividiendo segundo por 60 y cambiar el resultado a un número entero, España  -. horas , dividiendo minutos por 60 y cambiar el resultado a un número entero

He creado una función para hacer que el proceso de dividir la diferencia en
unidades enteras de tiempo, llamado split_to_whole_units, con esta demo:

console.log(split_to_whole_units(72000, [1000, 60]));
// -> [1,12,0] # 1 (whole) minute, 12 seconds, 0 milliseconds.

Esta respuesta se basa en ésta otra .

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;

}
  

Uso

     

var qtMonths = DateDiff ( 'mm', nuevos Fecha ( '05/05/2015'), nuevos Fecha ());

     

var qtYears = DateDiff ( 'yy', nuevos Fecha ( '05/05/2015'), nuevos Fecha ());

     

var qtDays = DateDiff ( 'dd', nuevos Fecha ( '05/05/2015'), nuevos Fecha ());

     
    

o

         

var qtMonths = DateDiff ( 'm', nuevos Fecha ( '05/05/2015'), nuevos Fecha ()); // m || Y || d

         

var qtMonths = DateDiff ( 'mes', new Date ( '5/5/2015'), new Date ()); // meses || año || día

         

var qtMonths = DateDiff ( 'meses, new Date ( '5/5/2015'), new Date ()); // meses || años || días

         

...

  
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;

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top