Soustraction entre deux dates
Salut,
J'essaye de faire (corriger plutôt) ou de trouver une fonction capable de soustraire une date à une autre dont le résultat dépendrait de l'intervalle (une période).
Par exemple :
DateDiff("d", "01/01/2006", "18/06/2006") retournerait 128
DateDiff("m", "01/01/2006", "18/06/2006") retournerait 5
Le problème est là, en fait si je veux obtenir le nombre de mois entre deux dates, j'aurais très souvent un nombre décimal. Lorsqu'on lit le script on comprend pourquoi :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| function DateDiff(per,datelimite,datedebut)
{
if (datelimite != '')
{
jourdeb = datedebut.substring(0,2);
moisdeb = datedebut.substring(3,5);
anneedeb = datedebut.substring(6,10);
var new_datedebut = moisdeb + "/" + jourdeb + "/" + anneedeb
jourlim = datelimite.substring(0,2);
moislim = datelimite.substring(3,5);
anneelim = datelimite.substring(6,10);
var new_datelimite = moislim + "/" + jourlim + "/" + anneelim
var datelim = new Date(new_datelimite)
var datedeb = new Date(new_datedebut)
var d = (datelim.getTime()-datedeb.getTime())/1000
switch(per)
{
case "yyyy": d/=12
case "m": d*=12*7/365.25
case "ww": d/=7
case "d": d/=24
case "h": d/=60
case "n": d/=60
}
//var diff = Math.ceil(d);
var diff = Math.floor(d);
alert(diff +"**"+ d);
if (diff < 0 ) {diff = 1200 + diff}
return diff;
}else {
return "";
}
} |
Le cas "m" est approximatif, DateDiff("m", "01/01/2006", "01/07/2006") retourne un d = 5.945.
Plus embêtant DateDiff("m", "01/01/2006", "18/06/2006") retourne un d = 5.518, le Math.ceil me retourne donc 6 ce qui est faux.
Voyez-vous mon problème?
Connaîtriez-vous une fonction existante faisant ce que je cherche? Ou un algorithme infaillible?
Re: Soustraction entre deux dates
Avec un peu de retard, j'arrive sur cette discussion :) (merci le thread annexe).
Pour moi, le problème est plus en amont que l'arrondissement de la date. A mon avis, pour passer en mois, il faut utiliser une autre méthode.
Je propose:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| // difference entre deux objets Date
function dateDiff(per,datedebut,datelimite) {
switch(per) {
case "y": return datelimite.getYear()-datedebut.getYear();
case "m": return (datelimite.getYear()-datedebut.getYear())*12 + datelimite.getMonth()-datedebut.getMonth();
}
var d = (datelimite.getTime()-datedebut.getTime())/1000
switch(per) {
case "w": d/=7
case "d": d/=24
case "h": d/=60
case "n": d/=60
case "s": break
default: return ""
}
return Math.floor(d);
} |
Qu'on peut tester avec ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
function testDateDiff() {
date1 = new Date()
date2 = new Date()
date1.setDate(1);
date1.setMonth(0);
date1.setYear(2006);
date2.setDate(18);
date2.setMonth(5);
date2.setYear(2006);
test(date1,date2);
date2.setYear(2007);
test(date1,date2);
}
function test(date1,date2) {
texte = "différence entre ";
texte += formatDate(date1);
texte += " et ";
texte += formatDate(date2);
texte += "\n";
texte += "années : " + dateDiff("y",date1,date2) + "\n";
texte += "mois : " + dateDiff("m",date1,date2) + "\n";
texte += "semaines : " + dateDiff("w",date1,date2) + "\n";
texte += "jours : " + dateDiff("d",date1,date2) + "\n";
texte += "heures : " + dateDiff("h",date1,date2) + "\n";
texte += "minutes : " + dateDiff("n",date1,date2) + "\n";
texte += "secondes : " + dateDiff("s",date1,date2);
alert(texte);
}
function formatDate(datef) {
texte="";
texte += (datef.getDate()<10?"0":"") + datef.getDate();
texte += "/";
texte += (datef.getMonth()<9?"0":"") + (datef.getMonth()+1);
texte += "/";
texte += datef.getFullYear();
return texte;
} |
Ca m'a l'air de marcher :)
Code Source?