Frage

Wie würde ich den Unterschied für zwei Datum ausrechnen () Objekte in JavaScript, während nur die Anzahl der Monate im Unterschied zurückkehren?

Jede Hilfe wäre toll:)

War es hilfreich?

Lösung

Die Definition von „die Anzahl der Monate in der Differenz“ unterliegt viel Interpretation. : -)

Sie können das Jahr, den Monat bekommen, und Tag des Monats von einem JavaScript-Objekt Datum. Je nachdem, welche Informationen Sie suchen, können Sie diese verwenden, um herauszufinden, wie viele Monate zwischen zwei Zeitpunkten.

Zum Beispiel, off-the-Manschette, diese Funde, wie viele volle Monate liegt zwischen zwei Daten, nicht mitgerechnet Teil Monaten (zB mit Ausnahme des Monats jedes Datum ist in):

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months -= d1.getMonth() + 1;
    months += d2.getMonth();
    return months <= 0 ? 0 : months;
}

monthDiff(
    new Date(2008, 10, 4), // November 4th, 2008
    new Date(2010, 2, 12)  // March 12th, 2010
);
// Result: 15: December 2008, all of 2009, and Jan & Feb 2010

monthDiff(
    new Date(2010, 0, 1),  // January 1st, 2010
    new Date(2010, 2, 12)  // March 12th, 2010
);
// Result: 1: February 2010 is the only full month between them

monthDiff(
    new Date(2010, 1, 1),  // February 1st, 2010
    new Date(2010, 2, 12)  // March 12th, 2010
);
// Result: 0: There are no *full* months between them

(Beachten Sie, dass Monat Werte in JavaScript mit 0 = Januar beginnen.)

Einschließlich fraktionierte Monate in der oben ist viel komplizierter, weil drei Tage in einem typischen Februar ein größerer Anteil des Monats ist (~ 10,714%) als drei Tage im August (~ 9,677%), und natürlich auch Februar ist ein sich bewegendes Ziel auf je nachdem, ob es ein Schaltjahr.

Es gibt auch einige Datum und Uhrzeit Bibliotheken für JavaScript verfügbar , die wahrscheinlich diese Art der Sache einfacher machen.

Andere Tipps

Wenn Sie nicht über den Tag des Monats betrachten, ist dies bei weitem der einfachere Lösung

function monthDiff(dateFrom, dateTo) {
 return dateTo.getMonth() - dateFrom.getMonth() + 
   (12 * (dateTo.getFullYear() - dateFrom.getFullYear()))
}


//examples
console.log(monthDiff(new Date(2000, 01), new Date(2000, 02))) // 1
console.log(monthDiff(new Date(1999, 02), new Date(2000, 02))) // 12 full year
console.log(monthDiff(new Date(2009, 11), new Date(2010, 0))) // 1

Beachten Sie, dass Monat Index 0-basiert. Dies bedeutet, dass January = 0 und December = 11.

Manchmal kann man nur die Menge der Monate zwischen zwei Daten völlig ignoriert den Tag Teil erhalten möchten. So zum Beispiel, wenn Sie zwei dates- haben 2013.06.21 bis 2013/10 / 18- und Sie nur über die 2013/06 und 2013/10 Teile gepflegt, hier sind die Szenarien und mögliche Lösungen:

var date1=new Date(2013,5,21);//Remember, months are 0 based in JS
var date2=new Date(2013,9,18);
var year1=date1.getFullYear();
var year2=date2.getFullYear();
var month1=date1.getMonth();
var month2=date2.getMonth();
if(month1===0){ //Have to take into account
  month1++;
  month2++;
}
var numberOfMonths; 

1. Wenn Sie wollen einfach nur die Anzahl der Monate zwischen den beiden Daten ohne die beiden month1 und month2

numberOfMonths = (year2 - year1) * 12 + (month2 - month1) - 1;

2. Wenn Sie eine der beiden Monate schließen

numberOfMonths = (year2 - year1) * 12 + (month2 - month1);

3. Wenn Sie beide der Monate schließen

numberOfMonths = (year2 - year1) * 12 + (month2 - month1) + 1;

Hier ist eine Funktion, die genau die Anzahl der Monate zwischen zwei Terminen zur Verfügung stellt.
Das Standardverhalten zählt nur ganze Monate, z.B. 3 Monate und 1 Tag in einer Differenz von 3 Monaten zur Folge hat. Sie können dies verhindern, indem die roundUpFractionalMonths param als true Einstellung, so dass ein 3 Monate und 1 Tag Differenz wird als 4 Monate zurückgeschickt werden.

Die akzeptierte Antwort oben (T. J. Crowder Antwort) ist nicht korrekt, es falsche Werte liefert manchmal.

Zum Beispiel monthDiff(new Date('Jul 01, 2015'), new Date('Aug 05, 2015')) kehrt 0, die offensichtlich falsch ist. Die korrekte Differenz ist entweder 1 ganzer Monat oder 2 Monate aufgerundete.

Hier ist die Funktion, die ich schrieb:

function getMonthsBetween(date1,date2,roundUpFractionalMonths)
{
    //Months will be calculated between start and end dates.
    //Make sure start date is less than end date.
    //But remember if the difference should be negative.
    var startDate=date1;
    var endDate=date2;
    var inverse=false;
    if(date1>date2)
    {
        startDate=date2;
        endDate=date1;
        inverse=true;
    }

    //Calculate the differences between the start and end dates
    var yearsDifference=endDate.getFullYear()-startDate.getFullYear();
    var monthsDifference=endDate.getMonth()-startDate.getMonth();
    var daysDifference=endDate.getDate()-startDate.getDate();

    var monthCorrection=0;
    //If roundUpFractionalMonths is true, check if an extra month needs to be added from rounding up.
    //The difference is done by ceiling (round up), e.g. 3 months and 1 day will be 4 months.
    if(roundUpFractionalMonths===true && daysDifference>0)
    {
        monthCorrection=1;
    }
    //If the day difference between the 2 months is negative, the last month is not a whole month.
    else if(roundUpFractionalMonths!==true && daysDifference<0)
    {
        monthCorrection=-1;
    }

    return (inverse?-1:1)*(yearsDifference*12+monthsDifference+monthCorrection);
};

Wenn Sie volle Monate rechnen müssen, unabhängig von dem Monat 28 sein, 29, 30 oder 31 Tage. Im Folgenden soll funktionieren.

var months = to.getMonth() - from.getMonth() 
    + (12 * (to.getFullYear() - from.getFullYear()));

if(to.getDate() < from.getDate()){
    months--;
}
return months;

Dies ist eine erweiterte Version der Antwort https://stackoverflow.com/a/4312956/1987208 aber fixe der Fall, wo es vom 31. Januar bis 1. Februar (1 Tag).

1 Monat für den Fall berechnet

Dies wird sich auf die folgenden;

  • 1. Januar - 31. Januar ---> 30 Tage ---> wird in 0 Ergebnis (logisch, da es nicht einen Monat ist)
  • 1. Februar - 1. MÄRZ ---> 28 oder 29 Tage ---> wird in 1 Ergebnis (logisch, da es einen ganzen Monat ist)
  • 15. Februar - 15. März ---> 28 oder 29 Tage ---> werden in 1 Ergebnis (logisch, da ein Monat vergangen)
  • 31. Januar - 1. Februar ---> 1 Tag ---> wird in 0 Ergebnis (offensichtlich, aber die erwähnte Antwort in den post-Ergebnisse in 1 Monat)

Differenz in Monaten zwischen zwei Daten in JavaScript:

 start_date = new Date(year, month, day); //Create start date object by passing appropiate argument
 end_date = new Date(new Date(year, month, day)

Insgesamt Monate zwischen Startdatum und Enddatum:

 total_months = (end_date.getFullYear() - start_date.getFullYear())*12 + (end_date.getMonth() - start_date.getMonth())

Ich weiß das wirklich zu spät ist, aber es trotzdem nur für den Fall der Veröffentlichung hilft es andere. Hier ist eine Funktion, die ich kam mit, dass eine gute Arbeit des Zählens Unterschiede in den Monaten zwischen zwei Terminen zu tun scheint. Es ist zwar sehr viel dreckiger als Mr.Crowder ist, sondern liefert genauere Ergebnisse, indem sie durch das Date-Objekt zu treten. Es ist in AS3, aber Sie sollten nur in der Lage sein, die starke Typisierung fallen zu lassen und Sie werden JS haben. Fühlen Sie sich frei, um es schöner jemand da draußen!

    function countMonths ( startDate:Date, endDate:Date ):int
    {
        var stepDate:Date = new Date;
        stepDate.time = startDate.time;
        var monthCount:int;

        while( stepDate.time <= endDate.time ) { 
            stepDate.month += 1;
            monthCount += 1;
        }           

        if ( stepDate != endDate ) { 
            monthCount -= 1;
        }

        return monthCount;
    }

Betrachten Sie jedes Datum in Monaten, dann abziehen, um die Differenz zu finden.

var past_date = new Date('11/1/2014');
var current_date = new Date();

var difference = (current_date.getFullYear()*12 + current_date.getMonth()) - (past_date.getFullYear()*12 + past_date.getMonth());

Dies wird man den Unterschied der Monate zwischen den beiden Daten erhalten, die Tage zu ignorieren.

Zur Erweiterung auf @ T. J. Antwort, wenn Sie sich für einfache Monate suchen, anstatt volle Kalendermonate, können Sie einfach überprüfen, ob d2 das Datum als größer oder gleich als d1 ist. Das heißt, wenn d2 später in seinem Monat ist als d1 in seinem Monat, dann gibt es 1 Monat mehr. So sollten Sie diese in der Lage sein, genau das zu tun:

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months -= d1.getMonth() + 1;
    months += d2.getMonth();
    // edit: increment months if d2 comes later in its month than d1 in its month
    if (d2.getDate() >= d1.getDate())
        months++
    // end edit
    return months <= 0 ? 0 : months;
}

monthDiff(
    new Date(2008, 10, 4), // November 4th, 2008
    new Date(2010, 2, 12)  // March 12th, 2010
);
// Result: 16; 4 Nov – 4 Dec '08, 4 Dec '08 – 4 Dec '09, 4 Dec '09 – 4 March '10

Dies gilt nicht völlig für Zeitfragen berücksichtigen (z 3. März um 16.00 Uhr und 3. April um 15.00 Uhr), aber es ist genauer und für nur ein paar Zeilen Code.

Es gibt zwei Ansätze, mathematische und schnell, aber unterliegen Unwägbarkeiten im Kalender oder iterative & langsam, aber Griffe alle Merkwürdigkeiten (oder zumindest die Delegierten sie auf eine gut getestete Bibliothek Handling).

Wenn Sie Iterierte durch den Kalender, das Startdatum um einen Monat erhöht wird und sehen, ob wir das Enddatum passieren. Diese Delegierten Anomalie-Behandlung auf die integrierten Date () Klassen, aber langsam sein könnten IF Sie dies von Terminen für eine große Anzahl tun. James' Antwort nimmt diesen Ansatz. So viel wie ich die Idee nicht mögen, ich denke, das das „sicherste“ -Ansatz ist, und wenn Sie nur tun ein Berechnung, wirklich der Performance-Unterschied ist zu vernachlässigen. Wir neigen dazu, über-optimize Aufgaben zu versuchen, die nur einmal durchgeführt werden.

, wenn Sie die Berechnung dieser Funktion auf einem Datensatz, werden Sie wahrscheinlich nicht wollen, dass die Funktion in jeder Zeile (oder Gott bewahre, mehrmals pro Datensatz) laufen. In diesem Fall Sie fast alle anderen Antworten hier verwenden können außer die akzeptierte Antwort, die einfach falsch ist (Unterschied zwischen new Date() und new Date() -1)?

Hier ist mein Stich an einem mathematisch-und-schnell-Ansatz, der für unterschiedliche Länge der Monate und Schaltjahre berücksichtigt. Sie sollten wirklich nur eine Funktion wie diese verwenden, wenn Sie diese zu einem Datensatz anwenden werden (tut diese Berechnung Over & Over). Wenn Sie nur einmal tun müssen, verwenden Sie James' iterative oben nähern, wie Sie delegieren alle Umgang mit den (vielen) Ausnahmen von dem Date () Objekt.

function diffInMonths(from, to){
    var months = to.getMonth() - from.getMonth() + (12 * (to.getFullYear() - from.getFullYear()));

    if(to.getDate() < from.getDate()){
        var newFrom = new Date(to.getFullYear(),to.getMonth(),from.getDate());
        if (to < newFrom  && to.getMonth() == newFrom.getMonth() && to.getYear() %4 != 0){
            months--;
        }
    }

    return months;
}

hier Sie anderen Ansatz mit weniger Looping:

calculateTotalMonthsDifference = function(firstDate, secondDate) {
        var fm = firstDate.getMonth();
        var fy = firstDate.getFullYear();
        var sm = secondDate.getMonth();
        var sy = secondDate.getFullYear();
        var months = Math.abs(((fy - sy) * 12) + fm - sm);
        var firstBefore = firstDate > secondDate;
        firstDate.setFullYear(sy);
        firstDate.setMonth(sm);
        firstBefore ? firstDate < secondDate ? months-- : "" : secondDate < firstDate ? months-- : "";
        return months;
}

Berechnen Sie die Differenz zwischen zwei Daten umfasst Bruchteil Monat (Tage).


var difference = (date2.getDate() - date1.getDate()) / 30 +
    date2.getMonth() - date1.getMonth() +
    (12 * (date2.getFullYear() - date1.getFullYear()));
  

Zum Beispiel:
   date1 : 24/09/2015 (24. September 2015)
   date2 : 2015.09.11 (9. November 2015)
  die Differenz: 2,5 (Monate)

Dies sollte funktionieren:

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months += d2.getMonth() - d1.getMonth();
    return months;
}

Sie können auch diese Lösung prüfen, diese function gibt den Monat Unterschied in der Zahl oder Zahl

Vorbei an der Startdatum als erste oder letzte param, ist fehlertolerant. Bedeutung, würde die Funktion immer noch den gleichen Wert zurück.

const diffInMonths = (end, start) => {
   var timeDiff = Math.abs(end.getTime() - start.getTime());
   return Math.round(timeDiff / (2e3 * 3600 * 365.25));
}

const result = diffInMonths(new Date(2015, 3, 28), new Date(2010, 1, 25));

// shows month difference as integer/number
console.log(result);

function calcualteMonthYr(){
    var fromDate =new Date($('#txtDurationFrom2').val()); //date picker (text fields)
    var toDate = new Date($('#txtDurationTo2').val());

var months=0;
        months = (toDate.getFullYear() - fromDate.getFullYear()) * 12;
        months -= fromDate.getMonth();
        months += toDate.getMonth();
            if (toDate.getDate() < fromDate.getDate()){
                months--;
            }
    $('#txtTimePeriod2').val(months);
}

folgender Code gibt volle Monate zwischen zwei Daten durch und Anzahl der Tage Teil Monate berücksichtigt werden.

var monthDiff = function(d1, d2) {
  if( d2 < d1 ) { 
    var dTmp = d2;
    d2 = d1;
    d1 = dTmp;
  }

  var months = (d2.getFullYear() - d1.getFullYear()) * 12;
  months -= d1.getMonth() + 1;
  months += d2.getMonth();

  if( d1.getDate() <= d2.getDate() ) months += 1;

  return months;
}

monthDiff(new Date(2015, 01, 20), new Date(2015, 02, 20))
> 1

monthDiff(new Date(2015, 01, 20), new Date(2015, 02, 19))
> 0

monthDiff(new Date(2015, 01, 20), new Date(2015, 01, 22))
> 0
function monthDiff(d1, d2) {
var months, d1day, d2day, d1new, d2new, diffdate,d2month,d2year,d1maxday,d2maxday;
months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth() + 1;
months += d2.getMonth();
months = (months <= 0 ? 0 : months);
d1day = d1.getDate();
d2day = d2.getDate();
if(d1day > d2day)
{
    d2month = d2.getMonth();
    d2year = d2.getFullYear();
    d1new = new Date(d2year, d2month-1, d1day,0,0,0,0);
    var timeDiff = Math.abs(d2.getTime() - d1new.getTime());
          diffdate = Math.abs(Math.ceil(timeDiff / (1000 * 3600 * 24))); 
    d1new = new Date(d2year, d2month, 1,0,0,0,0);
    d1new.setDate(d1new.getDate()-1);
    d1maxday = d1new.getDate();
    months += diffdate / d1maxday;
}
else
{
      if(!(d1.getMonth() == d2.getMonth() && d1.getFullYear() == d2.getFullYear()))
    {
        months += 1;
    }
    diffdate = d2day - d1day + 1;
    d2month = d2.getMonth();
    d2year = d2.getFullYear();
    d2new = new Date(d2year, d2month + 1, 1, 0, 0, 0, 0);
    d2new.setDate(d2new.getDate()-1);
    d2maxday = d2new.getDate();
    months += diffdate / d2maxday;
}

return months;

}

unten Logik Differenz in Monaten holen wird

(endDate.getFullYear()*12+endDate.getMonth())-(startDate.getFullYear()*12+startDate.getMonth())
function monthDiff(date1, date2, countDays) {

  countDays = (typeof countDays !== 'undefined') ?  countDays : false;

  if (!date1 || !date2) {
    return 0;
  }

  let bigDate = date1;
  let smallDate = date2;

  if (date1 < date2) {
    bigDate = date2;
    smallDate = date1;
  }

  let monthsCount = (bigDate.getFullYear() - smallDate.getFullYear()) * 12 + (bigDate.getMonth() - smallDate.getMonth());

  if (countDays && bigDate.getDate() < smallDate.getDate()) {
    --monthsCount;
  }

  return monthsCount;
}

Sehen Sie, was ich benutze:

function monthDiff() {
    var startdate = Date.parseExact($("#startingDate").val(), "dd/MM/yyyy");
    var enddate = Date.parseExact($("#endingDate").val(), "dd/MM/yyyy");
    var months = 0;
    while (startdate < enddate) {
        if (startdate.getMonth() === 1 && startdate.getDate() === 28) {
            months++;
            startdate.addMonths(1);
            startdate.addDays(2);
        } else {
            months++;
            startdate.addMonths(1);
        }
    }
    return months;
}
  

Es zählt auch die Tage und wandeln sie in Monaten.

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;   //calculates months between two years
    months -= d1.getMonth() + 1; 
    months += d2.getMonth();  //calculates number of complete months between two months
    day1 = 30-d1.getDate();  
    day2 = day1 + d2.getDate();
    months += parseInt(day2/30);  //calculates no of complete months lie between two dates
    return months <= 0 ? 0 : months;
}

monthDiff(
    new Date(2017, 8, 8), // Aug 8th, 2017    (d1)
    new Date(2017, 12, 12)  // Dec 12th, 2017   (d2)
);
//return value will be 4 months 

Für Wohlstand,

Mit Moment.js Sie können dies erreichen, indem Sie:

const monthsLeft = moment(endDate).diff(moment(startDate), 'month');
anyVar = (((DisplayTo.getFullYear() * 12) + DisplayTo.getMonth()) - ((DisplayFrom.getFullYear() * 12) + DisplayFrom.getMonth()));

wäre ein Ansatz, eine einfache Java Web Service (REST / JSON) zu schreiben, die JODA Bibliothek verwendet

http://joda-time.sourceforge.net/faq.html#datediff

zu berechnen Differenz zwischen zwei Daten und Anruf, dass der Service von Javascript.

Dies setzt voraus, Ihre Backend in Java ist.

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