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

Collection et Stream Java Discussion :

[Date] Conversion en millisecondes et formattage


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 14
    Par défaut [Date] Conversion en millisecondes et formattage
    Bonjour,

    J'ai 2 questions sur les dates.
    Tout d'abord, j'ai un objet avec les attributs "annee", "mois", ...
    J'ajoute ou retire des jours pour avoir la date adéquate.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    GregorianCalendar cal = new GregorianCalendar();
    cal.add(GregorianCalendar.DATE, nbJours);
    this.annee = cal.get(GregorianCalendar.YEAR);
    this.mois = cal.get(GregorianCalendar.MONTH)+1;
    this.jour = cal.get(GregorianCalendar.DATE);
    this.heure = cal.get(Calendar.HOUR_OF_DAY);
    this.minute = cal.get(Calendar.MINUTE); 	
    this.seconde = cal.get(Calendar.SECOND);
    1) Je formatte ma date comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private long toLong () {
      return (new GregorianCalendar(this.annee, this.mois, this.jour, this.heure, this.minute)).getTimeInMillis();
      }
     
    public String toString() {
      Date d = new Date(this.toLong());
      DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
      return dateFormat.format(d);
    }
    Et la chaîne retournée me donne le 29/10/2004.
    J'ai fait des essais en ajoutant des jours et la différence reste.
    Je corrige en retirant un mois mais je souhaitais savoir pourquoi.

    2) Mon deuxième souci ne porte que sur les mois en 31 jours.
    Je récupère une chaîne de caractères que je découpe pour initialiser les champs de mon objet.

    Je fais une différence des millisecondes pour savoir combien de jours, d'heures et de minutes séparent mes 2 dates.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    public static String comparDates (MaDate debut,  MaDate fin) {
      try {
        if ((debut == null )||(fin == null))
          throw new Exception("Date de debut et/ou de fin a null");
     
        long msecDebut = debut.toLong();  
        long msecFin = fin.toLong();
        long msecEntre = msecFin - msecDebut;
     
        int nbJours = (int)(msecEntre/MSEC_DAY);
        msecEntre = msecEntre - MSEC_DAY*nbJours;
     
        int nbHeures = (int)(msecEntre/MSEC_HOUR); 
        msecEntre = msecEntre - MSEC_HOUR*nbHeures;
     
        int nbMinutes = (int)(msecEntre/MSEC_MINUTE); 
     
        StringBuffer comparSB = new StringBuffer();
        if (nbJours > 0)
          comparSB.append(""+nbJours+"j ");
        if (nbHeures > 0)
          comparSB.append(""+nbHeures+"h ");
        if (nbMinutes > 0)
          comparSB.append(""+nbMinutes+"min");
     
        if (comparSB.length()==0) {
          comparSB.append("Aucune");
          long res = msecFin-msecDebut;
          System.out.println("Debut : "+msecDebut+" "+debut.toString());
          System.out.println("Fin : "+msecFin+" "+fin.toString());
          System.out.println("Entre : "+res);
          System.out.println("Total : "+nbJours+" "+nbHeures+" "+nbMinutes);
       }
       return comparSB.toString();
     } catch (Exception e) {
     System.out.println("XKLDate : comparDates() : "+e.getMessage());
     return "";
    }
    }
    A l'affichage de la String (exemple ci-dessous), la date est correcte.
    Mais la conversion de ma date en millisecondes (par la méthode ci-dessus)
    me donne ceci :

    Debut : 1096666200000 31/08/2004 23h30m00s
    Fin : 1096583400000 01/09/2004 00h30m00s
    Entre : -82800000
    Total : 0 -23 0

    Il n'y a pas d'erreur d'inversion entre début et fin, les dates sont conformes et cela se produit que sur les fin de mois de 31.
    Je sèche sur ce problème.

    Si vous avez des idées, n'hésitez pas.

    Merci d'avance

  2. #2
    Membre expérimenté
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Par défaut Re: [Date] Conversion en millisecondes et formattage
    Citation Envoyé par olivangel
    Bonjour,

    J'ai 2 questions sur les dates.
    Tout d'abord, j'ai un objet avec les attributs "annee", "mois", ...
    J'ajoute ou retire des jours pour avoir la date adéquate.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    GregorianCalendar cal = new GregorianCalendar();
    cal.add(GregorianCalendar.DATE, nbJours);
    this.annee = cal.get(GregorianCalendar.YEAR);
    this.mois = cal.get(GregorianCalendar.MONTH)+1;
    this.jour = cal.get(GregorianCalendar.DATE);
    this.heure = cal.get(Calendar.HOUR_OF_DAY);
    this.minute = cal.get(Calendar.MINUTE); 	
    this.seconde = cal.get(Calendar.SECOND);
    1) Je formatte ma date comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private long toLong () {
      return (new GregorianCalendar(this.annee, this.mois, this.jour, this.heure, this.minute)).getTimeInMillis();
      }
     
    public String toString() {
      Date d = new Date(this.toLong());
      DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
      return dateFormat.format(d);
    }
    Et la chaîne retournée me donne le 29/10/2004.
    J'ai fait des essais en ajoutant des jours et la différence reste.
    Je corrige en retirant un mois mais je souhaitais savoir pourquoi.
    Personnellement, je ferais plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cal.add(GregorianCalendar.DAY_OF_YEAR, nbJours);
    Sinon, je ne vois pas ce qui te pose probleme ici...
    S'il s'agit de la date formatée qui te donne 29/10/2004, ca me semble logique puisque tu fais toi-meme le decalage en initialisant this.mois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    this.mois = cal.get(GregorianCalendar.MONTH)+1;
    ...
    new GregorianCalendar(this.annee, this.mois, this.jour, this.heure, this.minute)


    Pour le 2eme point, tu ecris :
    Debut : 1096666200000 31/08/2004 23h30m00s
    Fin : 1096583400000 01/09/2004 00h30m00s
    Or
    1096666200000 > 1096583400000
    Et
    31/08/2004 23h30m00s < 01/09/2004 00h30m00s

    Tu aurais donc du voir que tes 2 methodes toString() et toLong() ne retournent pas les memes dates....
    Faudrait corriger ca d'abord avant d'essayer de les comparer

    ton decalage dans les mois (voir point 1) fait que ce que tu penses etre le 31/08/2004 23h30m00s est en fait le 01/09/2004 23h30m00s

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cal.add(GregorianCalendar.DAY_OF_YEAR, nbJours);
    C'est fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    this.mois = cal.get(GregorianCalendar.MONTH)+1; 
    ... 
    new GregorianCalendar(this.annee, this.mois, this.jour, this.heure, this.minute)
    En fait le compteur de mois commence à 0.
    Le "+1" c'était pour avoir le chiffre 9 pour septembre.
    C'est une mauvaise idée.
    Lorsque l'on formate la date, il doit y avoir un "+1" transparent.

    Tu aurais donc du voir que tes 2 methodes toString() et toLong() ne retournent pas les memes dates....
    Faudrait corriger ca d'abord avant d'essayer de les comparer
    Pas tout à fait. Ces méthodes sont correctes.
    J'avais d'autres méthodes notamment pour décomposer une chaîne et construire une date à partir de cette décomposition. Donc je ne met plus le "+1" dans le constructeur mais je mets "-1" au mois décomposé.
    Mon calendrier était erroné.

    Lorsque je saisissais une date en spécifiant le mois de septembre (donc 9 logiquement) cela correspondait à octobre (puisque cela commence à 0).

    Et donc dans mon exemple je comparais le 01/10/04 au 01/10/04 et non pas le 31/08/04 au 01/09/04 (30 jours en septembre).

    Je ne sais pas si j'ai été clair...

    Le principal c'est que cela marche et merci à toi Dude pour ton aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. oracle conversion de millisecondes en date
    Par grospatapouf dans le forum Débuter
    Réponses: 1
    Dernier message: 09/06/2009, 16h12
  2. [DATE][CONVERSION] du type numerique au type date
    Par hamed dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 06/04/2005, 16h16
  3. Réponses: 8
    Dernier message: 05/02/2005, 16h38
  4. [date] conversion d'une date et compatibilité access
    Par WriteLN dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 10/01/2005, 14h03
  5. Conversion en millisecondes
    Par Fabiani dans le forum Langage
    Réponses: 2
    Dernier message: 03/12/2003, 02h24

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