IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

opération sur les dates


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut opération sur les dates
    salut tout le monde.



    Comment fait-on pour connaitre la différence entre 2 dates en
    années, mois, jours, heures, minutes, secondes?
    Le tout en tenant compte des années bissextiles bien sur!
    Si je fais date1 = 31/12/2002 22:30:00
    date2 = 01/01/2003 08:00:00
    je voudrais que date2 - date 1 me renvoie 0 an 0 mois 0 jours
    9heures 30 minutes 0 secondes

    merci pour la reponse

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    bonsoir,
    je conçois qu'on puisse calculer la différence entre deux dates en secondes, minutes, heures, jours, voire semaines... mais en mois et années tu ne peux avoir qu'une valeur approchée puisque la durée d'un mois ou d'une année n'est pas constante.
    Sinon, pour calculer la différence en secondes entre deux dates, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long delai = (date2.getTime() - date1.getTime()) / 1000;
    Après, il te suffit de procéder par modulo/divisions successives par 60, 60, 24, 30 (31 ?), 12...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Regarde du coté de la classe java.util.Calendar et les méthodes get()/set()

  4. #4
    Membre régulier Avatar de BoudBoulMan
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 100
    Points : 116
    Points
    116
    Par défaut
    Si t'es 2 dates sont de la même années, tu peux faire la différence entre leurs positions dans l'année que tu obtiens avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Calendar date1 = Calendar.GetInstance();
    Calendar date2 = Calendar.getInstance();
     
    date1.set(2006, 5, 1); //1er mai 2006
    date2.set(2006, 7, 16); //16 juillet 2006
     
    int ecart = Math.abs(date1.get(Calendar.DAY_OF_YEAR) - date2.get(Calendar.DAY_OF_YEAR));
    S'il s'agit de deux dates dans 2 années qui se suivent.
    Par exemple: 12 juin 2005 et 15 février 2006
    Tu compares les deux années pour connaître la date la plus ancienne. Pour cette date, tu fais l'écart entre la date et 365 ou 366 selon que ce soit une année bissextile ou non. Tu ajoute cet écart à celui entre l'autre date et le début de l'année (soit sa position).
    Pour connaître si une année est bissextile ou non, la classe GregorianCalendar fournit la méthode isLeapYear(int year);

    Voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    GregorianCalendar date1 = new GregorianCalendar(2005, 6, 12);
    GregorianCalendar date1 = new GregorianCalendar(2006, 2, 15);
     
    int ecart = 0;
     
    int posDate1 = date1.get(Calendar.DAY_OF_YEAR);
    int posDate2 = date2.get(Calendar.DAY_OF_YEAR);
     
    if(date1.get(Calendar.YEAR) > date2.get(Calendar.YEAR)){
         if(date2.isLeapYear(date2.get(YEAR))){
              ecart = 366;
         }
         else{
              ecart = 365;
         }
     
         ecart -= posDate2;
         ecart += posDate1;
    }else{
         if(date1.isLeapYear(date1.get(YEAR))){
              ecart = 366;
         }
         else{
              ecart = 365;
         }
     
         ecart -= posDate1;
         ecart += posDate2;
    }
    Voilà, je n'ai pas vérifié mais je pense que c'est correct. Sinon, s'ils sont dans des années différentes mais qui ne se suivent pas, tu ajoutes, pour chaque année intermédiaires, 365 ou 366 (faire un test pour chaque année si elle est bissextile ou non).

    Il y a sûrement plus simple même si je trouve ça assez simple
    J'espère t'avoir aidé

    edit: Désolé, je n'ai montré que la méthode pour faire une différence en jours et j'ai oublié d'ajouter du code pour faire la différence avec les heures et minutes.

    Si on fait l'écart en jours, on obtient l'écart entre les dates à 0h00. Donc s'il y a des heures, elles vont faire varier l'écart. L'heure de la première date va rétrécir l'écart tandis que l'autre va l'agrandir.
    La méthode consiste à enlever d'une unité l'écart en jours entre les deux dates. Ensuite, calculer l'écart en heures des 2 jours comme s'ils se suivaient et l'ajouter à l'écart en jour.

    Exemple:
    date 1 = 16/06/2006 6h03
    date 2 = 18/07/2006 14h32

    écart en jour: 32 jours
    on enlève une unité à l'écart -> 31 jours
    On calcule l'écart en heures des 2 jours comme s'ils se suivaient (jour 1 6h03 -> jour suivant 14h32) => écart en heure = (24 - 6.05) + 14.533 = 32.453 heures

    il y a plus de 24 heures, on convertit en jour: 1jour 8heures 27minutes que l'on ajoute à l'écart de 31 jours.

    => 31 jours 8 heures et 27 minutes
    La forme des pyramides le prouve, l'homme a toujours eu tendance à en faire de moins en moins.

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pour l'écart en jours et en heures je passerais plutôt par une soustraction du getTime des deux dates (puis la division par le nombre de millisecondes dans un jour) ça t'éviteras à devoiur prévoir tous les cas à la con (février, années bisextiles,30 ou 31 jours)
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Points : 493
    Points
    493
    Par défaut
    en faite on fais comment pour recupérer la date du moment ? et l'heure ?
    Il y a 10 types de personnes sur la planète. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas...

  7. #7
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pour la date et l'heure du moment c'est simple: l'objet date les contient toutes les deux:

    Te crées un objet date correspondant au moment de la création, à toi ensuite de le manipuler avec un SimpleDateFormatter pou en ressortir l'heure, le jour, le mois...
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Points : 28
    Points
    28
    Par défaut
    j'avais besoin de ça aussi il y a quelques jours et j'ai trouvé des astuces qui m'ont aidé dans la FAQ!

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Points : 493
    Points
    493
    Par défaut
    Citation Envoyé par vonitiana
    j'avais besoin de ça aussi il y a quelques jours et j'ai trouvé des astuces qui m'ont aidé dans la FAQ!
    ouais mais moi pas
    Il y a 10 types de personnes sur la planète. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas...

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cyrill
    Citation Envoyé par vonitiana
    j'avais besoin de ça aussi il y a quelques jours et j'ai trouvé des astuces qui m'ont aidé dans la FAQ!
    ouais mais moi pas
    Et pourtant

    Citation Envoyé par cyrill
    en faite on fais comment pour recupérer la date du moment ? et l'heure ?
    Comment connaître l'heure courante ?
    Le constructeur par défaut de la classe java.util.Date construit une date initialisée à l'heure courante du système.
    a++

  11. #11
    Membre confirmé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Points : 493
    Points
    493
    Par défaut
    ouais je me suis mal exprimé. lol sa quand meme je savais faire mais maintenant si je veut récupéré que la date sous un format bien défini ? par exemple jj-mm-aaaa ?
    Il y a 10 types de personnes sur la planète. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas...

  12. #12
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par cyrill
    ouais je me suis mal exprimé. lol sa quand meme je savais faire mais maintenant si je veut récupéré que la date sous un format bien défini ? par exemple jj-mm-aaaa ?
    C'est quand même dans la FAQ :

    Comment convertir une date en chaîne ?

  13. #13
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par cyrill
    ouais je me suis mal exprimé. lol sa quand meme je savais faire mais maintenant si je veut récupéré que la date sous un format bien défini ? par exemple jj-mm-aaaa ?
    Au delà du lien de la faq la réponse se trouvait dans mon post précédent
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Points : 144
    Points
    144
    Par défaut
    une autre solution (histoire d'avoir toujours le choix des solutions)

    ta date ce n'est que des millisecondes
    Citation Envoyé par javadoc a dit
    long getTime()
    Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT represented by this Date object.
    et on a ce constructeur
    Citation Envoyé par javadoc a dit
    Date(long date)
    Allocates a Date object and initializes it to represent the specified number of milliseconds since the standard base time known as "the epoch", namely January 1, 1970, 00:00:00 GMT.
    donc pourquoi pas plus simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Date d1 = // une première date
    Date d2 = // une deuxième date
     
    Date date_difference = new Date(d1.getTime() - d2.getTime());
     
    // afficher date_difference.
    Je tiens à préciser que là où je suis je n'ai aucun compilo java, donc je n'ai pas pu tester. C'est juste une suggestion après avoir réfléchi à trouver une autre solution. D'ailleurs si certains pouvait me dire si c'était bon ça m'interesserait.

    L'avantage de cette solution c'est juste de ne pas s'encombrer de classe dont on pourrait se passer. De même on a pas se faire l'algo soit même en se posant toutes les eternelles questions sur les dates et ses $^ù$ù*^ d'années bissextiles et ces cons de mois qui n'ont pas tous le même nombre de jour


    ps : ha ben non finalement car le constructeur dit bien que c'est la date depuis le premier janvier 1970 donc si la différence va etre bonne le constructeur va créer une mauvaise date ( la bonne différence mais avec 1970 en plus dans l'année :'( donc ça marcherait peut etre en soustrayant 1970 dans l'année mais là ça fait trop bidouille ). J'aurai bien voulu supprimer mon post mais je n'ai pas trouver le bouton pour le supprimer ... donc désolé.

  15. #15
    Membre régulier Avatar de BoudBoulMan
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 100
    Points : 116
    Points
    116
    Par défaut
    Citation Envoyé par sinok
    Pour l'écart en jours et en heures je passerais plutôt par une soustraction du getTime des deux dates (puis la division par le nombre de millisecondes dans un jour) ça t'éviteras à devoiur prévoir tous les cas à la con (février, années bisextiles,30 ou 31 jours)
    Ouais, effectivement c'est une meilleure solution
    Le getTime va d'office comprende le jour "en plus" des années bissextile, donc c'est vachement plus pratique, en effet.
    Merci
    La forme des pyramides le prouve, l'homme a toujours eu tendance à en faire de moins en moins.

Discussions similaires

  1. [Dates] Opération sur les dates
    Par cassy dans le forum Langage
    Réponses: 3
    Dernier message: 06/08/2007, 14h16
  2. Opérations sur les dates
    Par coyotte507 dans le forum Contribuez
    Réponses: 12
    Dernier message: 07/03/2007, 13h32
  3. Opération sur les dates
    Par alainGL dans le forum Access
    Réponses: 2
    Dernier message: 07/03/2007, 08h27
  4. Opération sur les dates
    Par obily dans le forum Algorithmes et structures de données
    Réponses: 19
    Dernier message: 19/01/2007, 14h30
  5. opérations sur les dates
    Par coucoucmoi dans le forum Débuter
    Réponses: 2
    Dernier message: 12/08/2003, 11h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo