Soustraire deux DATES [Résolu/Fermé]

Messages postés
845
Date d'inscription
mardi 25 avril 2006
Dernière intervention
1 août 2017
- - Dernière réponse : Twinuts
Messages postés
5307
Date d'inscription
dimanche 4 mai 2003
Dernière intervention
14 décembre 2018
- 7 oct. 2006 à 16:10
Bonjour a tous.


Voila, il faudrais que je soustrais deux date qui sont au format "yyyy MM dd   hh:mm:ss". j'ai chercher un peut partous sur le net et sur les forums mais aucune reponses ne me permette de soustraire deux date (Date1 - Date2  avec Date1<Date2).
merci.
Afficher la suite 

20/21 réponses

Meilleure réponse
Messages postés
44
Date d'inscription
lundi 23 janvier 2006
Dernière intervention
12 août 2007
3
Merci
En fait,j'ai l'impression que soustraire deux dates peut poser probleme si tu souhaite exprimer les années et mois. en effet, si tu as une difference de 35 jours, est-ce 1 mois et 5 jours ou 1mois et 4 jours ? Le nombre de jours en 1 mois est fonction de ta position dans le calendrier. tu peux toujours exprimer les résultats depuis le 1er janvier de l'an 0 à minuit ou de l'an 1970 mais ton résultat sera inexploitable dans l'absolu.
En revanche tu peux toujours exprimer la difference en jours, heures, minutes et secondes :

String date1="2006 08 13   11:05:15";
String date2="2006 06 12   12:05:05";
SimpleDateFormat SDF = new SimpleDateFormat("yyyy MM dd   HH:mm:ss");
try{
    long resultat = (SDF.parse(date1)).getTime()-(SDF.parse(date2)).getTime();
    System.out.println(resultat/86400000+" jours"+(resultat%86400000)/3600000+":"+((resultat%86400000)%3600000)/60000+":"+(((resultat%86400000)%3600000)%60000)/1000);
}catch(java.lang.Exception e){
}

Sinon comme te l'a dit twinuts, fouine un peu Sunland, tu devrais y trouver des réponses.

Voilà, en esperant qu'on a quand même pu t'aider un peu ;)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de Ar0z
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
1
Merci
Salut :

GregorianCalendar d1 = new GregorianCalendar (1982, 9, 16);

// on va calculer la différence dans d2
GregorianCalendar d2 = new GregorianCalendar (2006, 10, 5);

d2.add (Calendar.YEAR, -d1.get (Calendar.YEAR));
d2.add (Calendar.MONTH,-d1.get (Calendar.MONTH));
d2.add (Calendar.DATE, -d1.get (Calendar.DATE));

System.out.println (d2.get (Calendar.YEAR)  + "-" +
                    d2.get (Calendar.MONTH) + "-" +
                    d2.get (Calendar.DATE));
Commenter la réponse de Ombitious_Developper
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Dernière intervention
1 août 2017
0
Merci
excusez moi, c'est "Date2<Date1"


merci.
Commenter la réponse de didoux95
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
0
Merci
Salut :

Juste une remarque dans mon exemple j'ai fait les calculs dans d2, si tu veux préserver le contenu de d2 tu peux faire :


GregorianCalendar d3 = new GregorianCalendar (
                  d2.get (Calendar.YEAR));
                  d2.get (Calendar.MONTH));
                  d2.get (Calendar.DATE));

ou encore :

GregorianCalendar d3 = (GregorianCalendar)d2.clone ();
Commenter la réponse de Ombitious_Developper
Messages postés
44
Date d'inscription
lundi 23 janvier 2006
Dernière intervention
12 août 2007
0
Merci
Bonjour,

Tes deux dates sont des chaines de caracteres exactement au format "yyyy MM dd   hh:mm:ss" ?
Si c'est le cas tu pourrais faire (soient date1 et date2 tes deux strings contenant les dates) :
(import java.util.Calendar et  java.lang.Integer)

Calendar cDate1 = Calendar.getInstance();
Calendar cDate2 = Calendar.getInstance();
cDate1.clear();
cDate2.clear();
cDate1.set((new Integer(date1.substring(0,4))).intValue(),
                (new Integer(date1.substring(5,7))).intValue(),
                (new Integer(date1.substring(8,10))).intValue(),
                (new Integer(date1.substring(13,15))).intValue(),
                (new Integer(date1.substring(16,18))).intValue(),
                (new Integer(date1.substring(19,21))).intValue());
cDate2.set((new Integer(date2.substring(0,4))).intValue(),
                (new Integer(date2.substring(5,7))).intValue(),
                (new Integer(date2.substring(8,10))).intValue(),
                (new Integer(date2.substring(13,15))).intValue(),
                (new Integer(date2.substring(16,18))).intValue(),
                (new Integer(date2.substring(19,21))).intValue());
long resultat = cDate1.getTimeInMillis()-cDate2.getTimeInMillis();

Voilà, tu obtient la difference entre tes deux dates en millisecondes dans resultat. Tu peux ensuite recréer un Calendar ou un Date à partir de ce chiffre.
Bon ok, c'est surement pas la meilleure solution mais c'est tout ce que j'ai en tête là maintenant pour soustraire deux dates qui étaient sous forme de chaines de caractères ^^
Commenter la réponse de Ar0z
Messages postés
44
Date d'inscription
lundi 23 janvier 2006
Dernière intervention
12 août 2007
0
Merci
Euh... la même chose en deux lignes :
(import java.text.SimpleDateFormat)

SimpleDateFormat SDF = new SimpleDateFormat("yyyy MM dd   HH:mm:ss");
long resultat = (SDF.parse(date1)).getTime()-(SDF.parse(date2)).getTime();

Pas testé mais çà devrait marcher, et çà paraît moins brutal xD !
Commenter la réponse de Ar0z
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Dernière intervention
1 août 2017
0
Merci
bonjour.


j'ai tester vos codes (Ombitious_Developper et Ar0z), mais pour le dernier code de ArOz, il y a deux erreures:
voila comment est ce que j'ai repris votre bout de code:
" Date date1=new Date("2006 10 05  20:00:00");
  Date date2=new Date("2006 10 05  20:15:00");
  SimpleDateFormat SDF = new SimpleDateFormat("yyyy MM dd  HH:mm:ss");
  long resultat = (SDF.parse(date1)).getTime()-(SDF.parse(date2)).getTime();
  System.out.println("Il y a comme ecart :"+resultat);"

mais voila les erreurs que le compilateur m'indique:
"F:\UseTime.java:10: cannot find symbol
symbol  : method parse(java.util.Date)
location: class java.text.SimpleDateFormat
                long resultat = (SDF.parse(date1)).getTime()-(SDF.parse(date2)).getTime();
                                                 ^
F:\UseTime.java:10: cannot find symbol
symbol  : method parse(java.util.Date)
location: class java.text.SimpleDateFormat
                long resultat = (SDF.parse(date1)).getTime()-(SDF.parse(date2)).getTime();
                                                                                                     ^
Note: F:\UseTime.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details."

merci.
Commenter la réponse de didoux95
Messages postés
5307
Date d'inscription
dimanche 4 mai 2003
Dernière intervention
14 décembre 2018
0
Merci
Salut,

petite correction de ton code [auteurdetail.aspx?ID=757549 didoux95] :

public static void main(String[] args) {
    String date1 = "2006 10 05 20:00:00";
    String date2 = "2006 10 05 20:15:00";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy MM dd HH:mm:ss");
    long resultat = 0;
    try {
        resultat = (sdf.parse(date1)).getTime()-(sdf.parse(date2)).getTime();
    } catch (ParseException e) {
        e.printStackTrace();
    }
    System.out.println("Il y a comme ecart :"+resultat);
}

fait
bien attention au nombre d'espaces que tu mets dans la chaine pattern
visiblement 2 espaces ou plus entre les champs posent problèmes.

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
Commenter la réponse de Twinuts
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Dernière intervention
1 août 2017
0
Merci
merci.
il n'y a desormais plus d'erreurs de compilation mais en revanche le temps renvoyer est "-900000".
ce temps est-il en  ms, sec, min, h, jour, mois, ...
je ne comprend pas, le programme ne devrais t-il pas revoiyer 0000 00 00 00:15:00  ?
Comment remedier a ce pb?

merci.
Commenter la réponse de didoux95
Messages postés
44
Date d'inscription
lundi 23 janvier 2006
Dernière intervention
12 août 2007
0
Merci
C'est un temps en millisecondes. Si tu veux le transformer en un string du même format que les autres (à tester):

String sresultat = SDF.format(new Date(java.lang.Math.abs(resultat)));
Commenter la réponse de Ar0z
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Dernière intervention
1 août 2017
0
Merci
merci ArOz.


je ne comprend toujour pas: maintenant cela m'affiche "1970 01 01 01:15:00" au lieu (je pense) de "0000 00 00 00:15:00".

encore merci...
Commenter la réponse de didoux95
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
0
Merci
Salut :

J'ai adapté ma solution pour répondre exactement  à ta question :

import java.util.*;

GregorianCalendar d1 = new GregorianCalendar (1982, 9, 16, 12, 12, 30);
GregorianCalendar d2 = new GregorianCalendar (2006, 10, 5, 10, 59, 20);
GregorianCalendar d3 = (GregorianCalendar)d2.clone ();

d3.add (Calendar.YEAR,   -d1.get (Calendar.YEAR));
d3.add (Calendar.MONTH,  -d1.get (Calendar.MONTH));
d3.add (Calendar.DATE,   -d1.get (Calendar.DATE));


d3.add (Calendar.HOUR,   -d1.get (Calendar.HOUR));

d3.add (Calendar.MINUTE, -d1.get (Calendar.


MINUTE


));

d3.add (Calendar.SECOND, -d1.get (Calendar.SECOND));




System.out.println (d3.get (Calendar.YEAR)    + "/" +
                    d3.get (Calendar.MONTH)   + "/" +
                    d3.get (Calendar.DA

TE)    + " " +
                   

d3.get (Calendar.HOUR

)    + ":" +
                   

d3.get (Calendar.MINUTE

)  + ":" +


                   

d3.get (Calendar.SECOND

)
);
Commenter la réponse de Ombitious_Developper
Messages postés
44
Date d'inscription
lundi 23 janvier 2006
Dernière intervention
12 août 2007
0
Merci
Oups, j'avais oublié ^^
Les Dates et  Calendars expriments le temps en nombre de millisecondes écoulées depuis le 1er janvier 1970 à minuit (la date EPOCH, sorte de JC pour les ordinateurs ^^).
Tu peux y soustraire le temps correspondant en millisecondes pour retrouver un résultat cohérent (ouais, je sais bourrin et pas terrible^^) ou faire ta soustraction non pas par les temps en millisencondes mais champs par champs.
Commenter la réponse de Ar0z
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
0
Merci
Salut :

Une erreur de frappe ce listening est bien correct :



import java.util.*;

GregorianCalendar d1 = new GregorianCalendar (1982, 9, 16, 12, 12, 30);
GregorianCalendar d2 = new GregorianCalendar (2006, 10, 5, 10, 59, 20);
GregorianCalendar d3 = (GregorianCalendar)d2.clone ();

d3.add (Calendar.YEAR,   -d1.get (Calendar.YEAR));
d3.add (Calendar.MONTH,  -d1.get (Calendar.MONTH));
d3.add (Calendar.DATE,   -d1.get (Calendar.DATE));



d3.add (Calendar.HOUR,   -d1.get (Calendar.HOUR));
d3.add (Calendar.MINUTE, -d1.get (Calendar.


MINUTE


));
d3.add (Calendar.SECOND, -d1.get (Calendar.SECOND));




System.out.println (d3.get (Calendar.YEAR)     + "/" +
                    d3.get (Calendar.MONTH)    + "/" +
                    d3.get (Calendar.DA

TE)     + " " +
                   

d3.get (Calendar.HOUR

)     + ":" +
                   

d3.get (Calendar.MINUTE

)   + ":" +


                   

d3.get (Calendar.SECOND

)
);
Commenter la réponse de Ombitious_Developper
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
0
Merci
Salut :

import java.util.*;

GregorianCalendar d1 = new GregorianCalendar (1982, 9, 16, 12, 12, 30);
GregorianCalendar d2 = new GregorianCalendar (2006, 10, 5, 10, 59, 20);
GregorianCalendar d3 = (GregorianCalendar)d2.clone ();

d3.add (Calendar.YEAR,   -d1.get (Calendar.YEAR));
d3.add (Calendar.MONTH,  -d1.get (Calendar.MONTH));
d3.add (Calendar.DATE,   -d1.get (Calendar.DATE));



d3.add (Calendar.HOUR,   -d1.get (Calendar.HOUR));
d3.add (Calendar.MINUTE, -d1.get (Calendar.


MINUTE


));
d3.add (Calendar.SECOND, -d1.get (Calendar.SECOND));




System.out.println (d3.get (Calendar.YEAR)     + "/" +
                    d3.get (Calendar.MONTH)    + "/" +
                    d3.get (Calendar.DA

TE)     + " " +
                   

d3.get (Calendar.HOUR

)     + ":" +
                   

d3.get (Calendar.MINUTE

)   + ":" +


                   

d3.get (Calendar.SECOND

)
);
Commenter la réponse de Ombitious_Developper
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Dernière intervention
1 août 2017
0
Merci
je vais peut etre passer pour un gas trop difficile mais y encore un pb:
(en gardant les meme valeur que precedement "2006 10 05 20:(15/00):00"), j'obtien:
"2/11/31 0:10:0" ce quoi est en rouge est correct mais pas le reste.

merci..
Commenter la réponse de didoux95
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Dernière intervention
1 août 2017
0
Merci
pour ArOz,
y pas un reglage ou un truc comme ca pour les Dateet les Calendar?

merci
Commenter la réponse de didoux95
Messages postés
44
Date d'inscription
lundi 23 janvier 2006
Dernière intervention
12 août 2007
0
Merci
euh là je ne sais pas trop, à part soustraire au champs time l'équivalent en millisecondes de l'écart que tu obtiens (ce qui n'est pas pratique), je ne vois pas.
Par contre, tu pourrais utiliser la méthode de ombitious_developper, je ne comprends pas tres bien le résultat que tu obtiens avec mais si çà marche tu n'aurais pas ce probleme de 1970 ans d'écart.
Commenter la réponse de Ar0z
Messages postés
5307
Date d'inscription
dimanche 4 mai 2003
Dernière intervention
14 décembre 2018
0
Merci
Sa   lut,

[auteurdetail.aspx?ID=757549 didoux95]  regarde mieux dans la javadoc tu y trouveras les réponses que tu veux et également sur le forum de sun il y à éxactement la réponse à ton prob maintenant si l'anglais te fais peur il est jamais trop tard pour ty mettre serieusement....

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
Commenter la réponse de Twinuts
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Dernière intervention
1 août 2017
0
Merci
Super ta methode de  XXXjour. c'etait exactement ce que je cherchais.
merci.
Commenter la réponse de didoux95

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.