Soustraire deux DATES [Résolu/Fermé]

Signaler
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
-
Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
-
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.

21 réponses

Messages postés
44
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
12 août 2007

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 ;)
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
35
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));
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
1
excusez moi, c'est "Date2<Date1"


merci.
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
35
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 ();
Messages postés
44
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
12 août 2007

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 ^^
Messages postés
44
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
12 août 2007

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 !
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
1
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.
Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
97
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
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
1
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.
Messages postés
44
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
12 août 2007

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)));
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
1
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...
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
35
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

)
);
Messages postés
44
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
12 août 2007

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.
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
35
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

)
);
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
35
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

)
);
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
1
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..
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
1
pour ArOz,
y pas un reglage ou un truc comme ca pour les Dateet les Calendar?

merci
Messages postés
44
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
12 août 2007

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.
Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
97
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
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
1
Super ta methode de  XXXjour. c'etait exactement ce que je cherchais.
merci.