Soustraire deux DATES [Résolu/Fermé]

didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 4 oct. 2006 à 20:39 - Dernière réponse : Twinuts 5280 Messages postés dimanche 4 mai 2003Date d'inscription 3 octobre 2018 Dernière intervention
- 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 

21 réponses

Meilleure réponse
Ar0z 44 Messages postés lundi 23 janvier 2006Date d'inscription 12 août 2007 Dernière intervention - 5 oct. 2006 à 19:21
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 ;)

Merci Ar0z 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Ar0z
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 5 oct. 2006 à 01:29
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
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 4 oct. 2006 à 20:40
0
Merci
excusez moi, c'est "Date2<Date1"


merci.
Commenter la réponse de didoux95
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 5 oct. 2006 à 01:47
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
Ar0z 44 Messages postés lundi 23 janvier 2006Date d'inscription 12 août 2007 Dernière intervention - 5 oct. 2006 à 05:36
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
Ar0z 44 Messages postés lundi 23 janvier 2006Date d'inscription 12 août 2007 Dernière intervention - 5 oct. 2006 à 05:57
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
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 5 oct. 2006 à 08:20
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
Twinuts 5280 Messages postés dimanche 4 mai 2003Date d'inscription 3 octobre 2018 Dernière intervention - 5 oct. 2006 à 12:37
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
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 5 oct. 2006 à 17:00
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
Ar0z 44 Messages postés lundi 23 janvier 2006Date d'inscription 12 août 2007 Dernière intervention - 5 oct. 2006 à 17:11
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
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 5 oct. 2006 à 17:24
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
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 5 oct. 2006 à 17:46
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
Ar0z 44 Messages postés lundi 23 janvier 2006Date d'inscription 12 août 2007 Dernière intervention - 5 oct. 2006 à 17:51
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
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 5 oct. 2006 à 17:57
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
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 5 oct. 2006 à 17:59
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
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 5 oct. 2006 à 17:59
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
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 5 oct. 2006 à 18:03
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
Ar0z 44 Messages postés lundi 23 janvier 2006Date d'inscription 12 août 2007 Dernière intervention - 5 oct. 2006 à 18:30
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
Twinuts 5280 Messages postés dimanche 4 mai 2003Date d'inscription 3 octobre 2018 Dernière intervention - 5 oct. 2006 à 18:59
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
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 7 oct. 2006 à 14:19
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.