Frage

Wie die Differenz zwischen zwei Datumsangaben finden?

War es hilfreich?

Lösung

Durch die Verwendung des Datum Objekt und seinen Millisekunden Wert, können Differenzen berechnet werden:

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.

Sie können die Anzahl von Sekunden erhalten (als integer / ganze Zahl) durch die Millisekunden dividiert durch 1000 es auf Sekunden zu konvertieren dann das Ergebnis Umwandlung in eine Ganzzahl (dies entfernt den Bruchteil der Millisekunden darstellt):

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

Sie könnten dann ganze minutes erhalten, indem seconds durch 60 dividiert und es in eine ganze Zahl konvertieren, dann hours durch minutes durch 60 dividiert und es in eine ganze Zahl konvertieren, dann längere Zeiteinheiten in der gleichen Weise. Daraus eine Funktion die maximale Gesamtmenge einer Zeiteinheit in dem Wert einer unteren Einheit und der Rest der unteren Einheit geschaffen werden kann, erhalten:

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.

Wenn Sie sich fragen, was die Eingabeparameter bereitgestellt oben für die zweite Date-Objekt sind, finden ihre Namen unter:

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

Wie in den Kommentaren dieser Lösung erwähnt, Sie müssen nicht unbedingt alle diese Werte schaffen, es sei denn, sie sind notwendig für das Datum, das Sie möchten darstellen.

Andere Tipps

Das habe ich gefunden und es funktioniert gut für mich:

die Berechnung der Differenz zwischen zwei bekannten Daten

Leider ein Datum Intervall wie Tage der Berechnung, Wochen oder Monate zwischen zwei bekannten Terminen ist nicht so einfach, denn man kann nicht einfach addieren Datum Objekte zusammen. Um ein Date-Objekt in jeder Art von Berechnung zu verwenden, müssen wir zuerst das Datum der internen Wert in Millisekunden abrufen, die als eine große ganze Zahl gespeichert ist. Die Funktion, das zu tun ist date.getTime (). Sobald beide Daten umgewandelt wurden, Subtrahieren der später eine von den früheren kehrt man die Differenz in Millisekunden. Das gewünschte Intervall kann dann durch Dividieren dieser Zahl durch die entsprechende Anzahl von Millisekunden bestimmt werden. Zum Beispiel der Anzahl der Tage für eine bestimmte Anzahl von Millisekunden zu erhalten, würden wir von 86.400.000 teilen, die Anzahl der Millisekunden an einem Tag (1000 x 60 Sekunden x 60 Minuten x 24 Stunden):

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

Die Rundung ist optional, je nachdem, ob Sie Teil Tage wollten oder nicht.

Referenz

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

Wenn Sie einen Unterschied als eine Kombination von Jahren, Monaten zum Ausdruck suchen, und Tage, würde ich diese Funktion vorschlagen:

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

Diese Lösung wird ein Schaltjahr (29. Februar) und Monat Längendifferenzen in einer Art und Weise behandeln würden wir natürlich tun (glaube ich).

So zum Beispiel das Intervall zwischen dem 28. Februar 2015 und 28. März 2015 wird genau einen Monat, nicht 28 Tage in Betracht gezogen werden. Wenn beide jener Tage im Jahr 2016 sind, wird der Unterschied noch genau ein Monat, nicht mehr als 29 Tage.

Daten mit genau den gleichen Monat und Tag, aber anderem Jahr, werden immer einen Unterschied von einer exakten Anzahl von Jahren. So ist der Unterschied zwischen 2015.03.01 und 2016.03.01 wird genau 1 Jahr, nicht mehr als 1 Jahr und 1 Tag (weil von 365 Tagen als 1 Jahr gezählt).

Diese Antwort, basierend auf einem anderen (Link am Ende), ist über den Unterschied zwischen zwei Daten.
Sie können sehen, wie es funktioniert, weil es einfach ist, auch enthält es Splitting den Unterschied in
Zeiteinheiten (eine Funktion, die ich gemacht) und die Umstellung auf UTC zu stoppen Zeitzone Problemen.

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

Wie mein Code über Werke

Eine Datum / Zeitdifferenz, wie Millisekunden berechnet werden, mit dem Datum Objekt:

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.

Dann in dieser Differenz die Anzahl der Sekunden zu arbeiten, teilen sie durch 1000 konvertieren
Millisekunden bis Sekunden, dann das Ergebnis auf eine ganze Zahl ändern (ganze Zahl) entfernen
die Millisekunden (Fraktion Teil dieser dezimal). var seconds = parseInt(diff/1000)
Auch könnte ich mehr Zeiteinheiten mit dem gleichen Verfahren, zum Beispiel erhalten:
 - (ganz) Minuten , Dividieren Sekunden um 60 und um das Ergebnis zu einer ganzen Zahl zu ändern,
 -. h , Dividieren Minuten um 60 und das Ergebnis auf eine ganze Zahl zu ändern

habe ich eine Funktion für diesen Prozess der Aufspaltung zu tun, den Unterschied in
ganze Einheiten der Zeit, mit dem Namen split_to_whole_units, mit dieser Demo:

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

Diese Antwort basiert auf diesem anderen .

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;

}
  

Verwendung

     

var qtMonths = DateDiff ( 'mm', new Date ( '2015.05.05'), new Date ());

     

var qtYears = DateDiff ( 'JJ', new Date ( '2015.05.05'), new Date ());

     

var qtDays = DateDiff ( 'dd', new Date ( '2015.05.05'), new Date ());

     
    

oder

         

var qtMonths = DateDiff ( 'm', new Date ( '2015.05.05'), new Date ()); // m || y || d

         

var qtMonths = DateDiff ( 'Monat', new Date ( '2015.05.05'), new Date ()); // Monat || Jahr || Tag

         

var qtMonths = DateDiff ( 'Monate', new Date ( '2015.05.05'), new Date ()); // Monate || Jahre || Tage

         

...

  
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;

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top