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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 9
    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 Expert 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
    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 émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

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

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 100
    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

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    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)

  6. #6
    Membre éprouvé
    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 : 37
    Localisation : Suisse

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

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut
    en faite on fais comment pour recupérer la date du moment ? et l'heure ?

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