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

Java Discussion :

time.before ne marche pas


Sujet :

Java

  1. #1
    Membre très actif Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Par défaut time.before ne marche pas
    Bonjour
    je récupère un objet Time a partir de la base de données de cette facon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Time timeEnd = rs.getTime("DateFin");
    Et je le compare avec un objet qui représente le temps actuel initialisé de cette facon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Time now = new Time(today.getTime());
    J'essaye de vérifier si le timeEnd n'est pas encore atteint, j'utilise la methode suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boolean ret =  now.before(timeEnd);
    Mais la fonction before ne retourne pas le bon résultat !!!
    Pourriez vous m'indiquer mon erreur ?
    PS:
    * Time est du package java.sql
    * Le type du champ DateFin dans la bd est datetime (car j'ai besoin aussi de la date de fin) et l'enregistrement est sous forme DD-MM-YYYY HH:MM:SS

    merci pour votre aide

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    affiche ca, juste avant ton test, pour voir avec quelles données tu travaille réellement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println("comparing db time: " +timeEnd+ " and now "+ now);

  3. #3
    Membre très actif Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println("comparing db time: " +timeEnd+ " and now "+ now);
    ça donne exactement les temps que je veux tester..Je faisais deja mes verifications de valeurs avec le debugage (sur netbeans).
    A mon avis le probleme vient du format (12h/24h) de l'heure ! Le problème apparait dans le cas où timeEnd = 19:00:00 et par exemple now = 12:14:00

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    les dates n'ont pas de formatage interne ni de timezone, c'est juste un long. Si elles s'affichent correctement, y a aps de raison que before / after soit incohérent.

  5. #5
    Membre très actif Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Par défaut
    Voici un teste que je viens de faire :
    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
    import java.sql.Time;
    public class Main 
    {
        public static void main(String[] args) throws Exception
        {
            Time now = new Time(new java.util.Date().getTime());
            Time t = new Time(0,0,0);
            while(true)
            {
                System.out.println("t="+t);
                System.out.println("now="+now);
                t.setTime(t.getTime()+1000);
                System.out.println("t.before(now) = "+t.before(now));
            }
        }
    }
    Et voici un bout du résultats de sortie :
    ...
    t=18:40:07
    now=18:40:13
    t.before(now) = true
    t=18:40:08
    now=18:40:13
    t.before(now) = true
    t=18:40:09
    now=18:40:13
    t.before(now) = true
    t=18:40:10
    now=18:40:13
    t.before(now) = true
    t=18:40:11
    now=18:40:13
    t.before(now) = true
    t=18:40:12
    now=18:40:13
    t.before(now) = true
    t=18:40:13
    now=18:40:13
    t.before(now) = true
    t=18:40:14
    now=18:40:13
    t.before(now) = true
    t=18:40:15
    now=18:40:13
    t.before(now) = true
    t=18:40:16
    now=18:40:13
    t.before(now) = true
    ...
    ça m'etonne !!!

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Time now = new Time(new java.util.Date().getTime());
    now vaut "maintenant".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Time t = new Time(0,0,0);
            t.setTime(t.getTime()+1000);
    t vaut "premier janvier 1970 et des poussières"

    De plus, il est clairement indiqué dans la javadoc que le constructeur Time(int,int,int) est déprécié et que tu devrais utiliser Time(long).

    Time hérite de Date, et la méthode before() se trouve dans Date. Donc la comparaison va utiliser le moment depuis le 1er janvie 1970 comme critère de comparaison. est l'équivalent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t.getTime()<now.getTime()
    en pratique, tu devrais pouvoir utiliser t.before et t.after à condition que tes deux objets soient bien des Time sql donc les données de jour / mois / année ne sont pas présentes.

  7. #7
    Membre très actif Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Par défaut
    oui effectivement je l'ai remarqué a la derniere minute !! lol
    merci pour ton aide
    je marque le topic comme résolu

  8. #8
    Membre très actif Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Par défaut
    j'ai une autre question a ce sujet: Quelle la façon la plus simple en Java de créer un objet de type Time qui désigne 8h00 de ce matin par exemple ? le but est de créer une instance qui désigne un moment déterminé (jj-mm-aaaa hh:mm:ss)
    merci

  9. #9
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    2 solutions :

    Utiliser un Calendar :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Calendar cal = new GregorianCalendar(2009, Calendar.FEBRUARY, 19, 8,0,0);
    Date date = cal.getTime();
    Utiliser un parseur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yy HH:mm:ss");
    Date date = sdf.parse("19-02-2009 08:00:00");

  10. #10
    Membre très actif Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Par défaut
    merci de ton aide, c'est une bonne idée
    le probleme pour moi c'est que je récupere un Time (sans Date) depui une base de données, et ce Time désigne toujours le temps d'aujourd'hui, alors dans ce cas comment créer une instance de Time qui veux dire aujourd'hui a l'heure déterminée dans la base de données, sans passer par les méthodes predicate biensur parce que c'est ca que j'évite d'utiliser.

  11. #11
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Citation Envoyé par subzero01 Voir le message
    merci de ton aide, c'est une bonne idée
    le probleme pour moi c'est que je récupere un Time (sans Date) depui une base de données, et ce Time désigne toujours le temps d'aujourd'hui, alors dans ce cas comment créer une instance de Time qui veux dire aujourd'hui a l'heure déterminée dans la base de données, sans passer par les méthodes predicate biensur parce que c'est ca que j'évite d'utiliser.
    Pardon, j'ai lu en diagonale.

    Dans ce cas, peut être utiliser 2 Calendar :

    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
     
    //le timer récupéré de la base
    Time timeEndTemp = rs.getTime("DateFin");
     
    Calendar cal = new GregorianCalendar(); //initialisé à la date et l'heure du jour, on va donc lui changer l'heure
     
    Calendar cal2 = new GregorianCalendar();//on va utiliser ce calendar pour changer l'heure du premier
    cal2.setTime(timeEndTemp.getTime()); // le calendar 2 a son heure qui correspond avec la base
     
    //changement d'heure du premier calendar
    cal.set(Calendar.HOUR_OF_DAY , cal2.get(Calendar.HOUR_OF_DAY));
    cal.set(Calendar.MINUTE , cal2.get(Calendar.MINUTE ));
    cal.set(Calendar.SECOND, cal2.get(Calendar.SECOND));
     
    //on reconstruit l'objet time à partir du cal
    Time timerEnd = cal.getTime();
     
    //maintenant un objet Time pour "maintenant".
    Time now = new Time(new java.util.Date().getTime());
     
    //comparaison des 2
    if (now.before(timerEnd)){
       //du code
    }
    Bon, c'est lourd, il y a peut être plus simple.

    Je précise que j'ai pas testé.

  12. #12
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par subzero01 Voir le message
    merci de ton aide, c'est une bonne idée
    le probleme pour moi c'est que je récupere un Time (sans Date) depui une base de données, et ce Time désigne toujours le temps d'aujourd'hui, alors dans ce cas comment créer une instance de Time qui veux dire aujourd'hui a l'heure déterminée dans la base de données, sans passer par les méthodes predicate biensur parce que c'est ca que j'évite d'utiliser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    c = new GregorianCalendar();
    c.set(Calendar.HOUR,8);
    c.set(Calendar.MINUTE,30);
    c.set(Calendar.SECOND,0);
    c.set(Calendar.MILLISECOND,0);
    Time t = new Time(c.getTimeInMillis());

  13. #13
    Membre très actif Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Par défaut
    oui apparemment c'est un peu lourd mais bon, je prends tant qu'il y a pas meilleur
    merci de ton aide

Discussions similaires

  1. time out ca marche pas
    Par homomorphisme dans le forum C#
    Réponses: 8
    Dernier message: 23/06/2008, 17h16
  2. 'SHOW TABLES' marche pas sous postgresql !?
    Par fet dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 13/05/2004, 09h28
  3. Réponses: 9
    Dernier message: 07/05/2003, 12h57
  4. [GifDecoder] marche pas dans applet avec IE
    Par formentor dans le forum Applets
    Réponses: 2
    Dernier message: 06/05/2003, 10h43
  5. Sysdate qui marche pas ??
    Par StouffR dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/08/2002, 13h23

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