2013-01-03 3 views
1

Je me demande si quelqu'un a une fonction JavaScript pour retourner le nombre de mois et de jours entre 2 dates? Par exemple, si passé 01/01/2013 et 03/01/2015 (format de date UK) Il reviendrait 24 mois 2 jours. J'ai la partie des mois, mais je me bats avec les jours. Il y a 2 champs de date sur mon formulaire au format jj/mm/aaaa. voici le code que j'ai jusqu'à présent:Javascript Mois et Jours entre les dates

function calculateDateDifference(){ 
var startDateValue=document.forms[0].StartDate.value; 
var endDateValue=document.forms[0].EndDate.value; 

var startDateArray=startDateValue.split("/"); 
var endDateArray=endDateValue.split("/"); 

var startDate= new Date(startDateArray[2], startDateArray[1], startDateArray[0]); 
var endDate= new Date(endDateArray[2], endDateArray[1], endDateArray[0]); 

var diffYears = endDate.getFullYear()-startDate.getFullYear(); 
var diffMonths = endDate.getMonth()-startDate.getMonth(); 
var diffDays = endDate.getDate()-startDate.getDate(); 

var months = ((diffYears*12) + diffMonths); 
if (diffDays<0){ 
    months=months-1; 
    } 
alert(months + " months"); 
} 

Merci à l'avance, Niall.

+0

consultez http://www.datejs.com/ –

+0

Désolé mais je pense que votre approche de ce problème est défectueuse. Un problème que vous rencontrerez est que les mois sont incompatibles. Que signifie 1 mois? 31 jours? 30? 28? Cela ne vous permet pas beaucoup de précision. Vous devriez peut-être repenser votre approche et vous demander si c'est utile ou nécessaire de calculer le nombre de mois entre les dates. – IsisCode

Répondre

0

Cette fonction calcule le nombre de jours entre deux dates au format UK (little Endian).

​function subtractDates(firstDate, secondDate){ 
     var fdObj, sdObj; 
     firstDate = littleToMiddleEndian(firstDate); 
     secondDate = littleToMiddleEndian(secondDate); 
     function littleToMiddleEndian(led){ 
      var a = led.split("/") 
      return [a[1],a[0],a[2]].join("-"); 
     } 
     fdObj = new Date(firstDate); 
     sdObj = new Date(secondDate); 
     return sdObj-fdObj/86400000; 
    } 
    var daysBetween = subtractDates("10/01/12","17/01/12"); 
    console.log(daysBetween); 

D'abord, il utilise une fonction interne pour convertir les dates de format little endian (dd-mm-aa) au milieu le format endian (mm-jj-aa) requise par l'objet Date. Ensuite, il crée deux objets Date et soustrait l'un de l'autre, puis divise par 86400000 (le nombre de millisecondes dans un jour) qui résulte en un nombre entier représentant le nombre de jours entre les deux dates.

+0

Merci @IsisCode. J'ai ajouté mon code jusqu'ici et j'ai quelque chose de très similaire pour Monthe. Je travaille actuellement sur les jours – nelsie

+0

Le format "middle endian" n'est pas du tout requis par le constructeur Date. Jusqu'à ES5, l'analyse des chaînes dépendait de l'implémentation. Le seul format de chaîne spécifié pour ECMA-262 est une version du [format long ISO8601] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15). Puisque vous divisez la date en ses composants, il vaut mieux utiliser simplement les parties: 'return new Date (a [2], --a [1], a0)' pour obtenir une fonction de navigation croisée conforme aux standards qui ne fonctionne pas dépend des caprices du navigateur. – RobG

0

Merci à la réponse par @Zazerat sur this post

Je suis venu avec une solution. @Jazerat fourni une version réduite de JSDate que j'ai inclus pour permettre facilement l'ajustement du mois sur une date. Voici le code final:

Date.isLeapYear = function (year) { 
    return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); 
}; 

Date.getDaysInMonth = function (year, month) { 
    return [31, (Date.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; 
}; 

Date.prototype.isLeapYear = function() { 
    var y = this.getFullYear(); 
    return (((y % 4 === 0) && (y % 100 !== 0)) || (y % 400 === 0)); 
}; 

Date.prototype.getDaysInMonth = function() { 
    return Date.getDaysInMonth(this.getFullYear(), this.getMonth()); 
}; 

Date.prototype.addMonths = function (value) { 
    var n = this.getDate(); 
    this.setDate(1); 
    this.setMonth(this.getMonth() + value); 
    this.setDate(Math.min(n, this.getDaysInMonth())); 
    return this; 
}; 

function daysInMonth(month,year) { 
    return new Date(year, month, 0).getDate(); 
} 


function calculateLeasePeriod(){ 

var startDateValue=document.forms[0].StartDate.value; 
var endDateValue=document.forms[0].EndDate.value; 

if (endDateValue!="" && startDateValue!=""){ 

    var startDateArray=startDateValue.split("/"); 
    var endDateArray=endDateValue.split("/"); 

    var startDate= new Date(startDateArray[2], startDateArray[1], startDateArray[0]); 
    var endDate= new Date(endDateArray[2], endDateArray[1], endDateArray[0]); 

    var diffYears = endDate.getFullYear()-startDate.getFullYear(); 
    var diffMonths = endDate.getMonth()-startDate.getMonth(); 
    var diffDays = endDate.getDate()-startDate.getDate(); 

    var months = ((diffYears*12) + diffMonths); 
    if (diffDays<0){ 
     months=months-1; 
     var adjStartDate = startDate.addMonths(months); 
     diffDays = endDate.getDate()-adjStartDate.getDate(); 
     if (diffDays<0){ 
      diffDays=daysInMonth(adjStartDate.getMonth(), adjStartDate.getYear())+ diffDays; 
      } 
     } 

    $("#PrimaryLeasePeriod").html(months + " months and " + diffDays + " days"); 

    }else{ 
     $("#PrimaryLeasePeriod").html(""); 
    } 
} 

J'espère que quelqu'un d'autre trouve cela utile!

Questions connexes