Soustraire deux DATES

Résolu
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 - 4 oct. 2006 à 20:39
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 - 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.
A voir également:

21 réponses

Ar0z Messages postés 44 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 12 août 2007
5 oct. 2006 à 19:21
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 ;)
3
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
5 oct. 2006 à 01:29
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));
2
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
4 oct. 2006 à 20:40
excusez moi, c'est "Date2<Date1"


merci.
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
5 oct. 2006 à 01:47
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 ();
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ar0z Messages postés 44 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 12 août 2007
5 oct. 2006 à 05:36
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 ^^
0
Ar0z Messages postés 44 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 12 août 2007
5 oct. 2006 à 05:57
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 !
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
5 oct. 2006 à 08:20
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.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
5 oct. 2006 à 12:37
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
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
5 oct. 2006 à 17:00
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.
0
Ar0z Messages postés 44 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 12 août 2007
5 oct. 2006 à 17:11
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)));
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
5 oct. 2006 à 17:24
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...
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
5 oct. 2006 à 17:46
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

)
);
0
Ar0z Messages postés 44 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 12 août 2007
5 oct. 2006 à 17:51
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.
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
5 oct. 2006 à 17:57
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

)
);
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
5 oct. 2006 à 17:59
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

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

merci
0
Ar0z Messages postés 44 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 12 août 2007
5 oct. 2006 à 18:30
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.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
5 oct. 2006 à 18:59
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
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
7 oct. 2006 à 14:19
Super ta methode de  XXXjour. c'etait exactement ce que je cherchais.
merci.
0
Rejoignez-nous