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 :

Calendar et "Epoch" bizarre !


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Profil pro
    Info
    Inscrit en
    Novembre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Info

    Informations forums :
    Inscription : Novembre 2009
    Messages : 60
    Points : 46
    Points
    46
    Par défaut Calendar et "Epoch" bizarre !
    Salut !

    Pour situer le problème je voulais convertir un string obtenu avec un getParameter, "min", "hour" ou "day" dans les equivalents en milliseconde 60*1000, 60*60*1000 ou 24*60*60*1000 pour ensuite le rajouter à une date déjà convertie en millisecondes et revenir ensuite à la nouvelle date obtenue.

    Donc je pensais faire un peu comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public long changeTag2Time(String tag){
    		long scaleTime;
    		if(tag.equals("min")){
    			scaleTime = 60*1000;
    		}
    		else if(tag.equals("hour")){
    			scaleTime = 60*60*1000;
    		}
    		else{ //tag.equals("day")
    			scaleTime = 24*60*60*1000;
    		}
    		return scaleTime;
    }
    et ensuite un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SimpleDateFormat  simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String testdate = "2010-01-01 00:00:00";   //par exemple
    Date mytestdate = simpleDateFormat.parse(testdate);
    Calendar testcal = Calendar.getInstance();
    testcal.setTime(mytestdate);
    long testmilli = testcal.getTimeInMillis() + changeTag2Time("min");
    Date mytestdateCorr = new Date(testmilli);
    Mais au détour de mes tests j'ai remarqué que l'équivalent de 0 milliseconde n'est pas du tout ce que la doc Calendar prétend, à savoir, le 1 janvier 1970 à 00:00:00 GMT (Gregorian) !!!

    Voici un bout de code de tests et les outputs obtenus :
    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
     
    SimpleDateFormat  simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     
    String testdate = "1970-01-01 00:01:00";
    Date mytestdate = simpleDateFormat.parse(testdate);
    Calendar testcal = Calendar.getInstance();
    testcal.setTime(mytestdate);
    long testmilli = testcal.getTimeInMillis() - (60*1000L);
    long longtest2 = 60*1000L;
    System.out.println("Difference dans testdate : "+testmilli);
    Date test1 = new Date(testcal.getTimeInMillis());
    Date test2 = new Date(longtest2);
    System.out.println("In milli --> test1 : "+testcal.getTimeInMillis()+"   test2 : "+60*1000L);
    System.out.println("In date  --> test1 : "+test1+"   test2 : "+test2);
    long zero = 0L;
    Date zerodate = new Date(zero);
    System.out.println("Date 0 : "+zerodate);
    qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Difference dans testdate : -3600000
    In milli --> test1 : -3540000   test2 : 60000
    In date  --> test1 : Thu Jan 01 00:01:00 CET 1970   test2 : Thu Jan 01 01:01:00 CET 1970
    Date 0 : Thu Jan 01 01:00:00 CET 1970
    Après vérification c'est en fait un horaire CET (GMT+1h) qui explique bien cela ... et donc en fait qu'avec 60*1000 il n'ajoutait pas une minute mais une heure et une minute.
    A part enlever à la bourrin 1h manuellement je voulais vous consulter pour savoir quelles solutions je pourrais avoir pour corriger cela ?
    Ou alors si vous avez des idées pour faire ce que je veux faire plus simplement je suis preneur !

    Merci

  2. #2
    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
    Le calcul en passant par des millisecondes t'amènent en général sur des cornercases qui foutent la merde.

    Je te conseille plutôt de passer par un Calendar qui gèrera tout pour toi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int hour=17;
    int minutes= 11;
    int seconds = 47;
    Date d = ...   //ta date initiale
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    c.add(Calendar.HOUR_OF_DAY,hour);
    c.add(Calendar.MINUTE,minutes);
    c.add(Calendar.SECOND,seconds);
    Date maDateCalculee = c.getTime();
    Et le tour est joué.
    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.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par nodules Voir le message
    Après vérification c'est en fait un horaire CET (GMT+1h) qui explique bien cela ... et donc en fait qu'avec 60*1000 il n'ajoutait pas une minute mais une heure et une minute.
    A part enlever à la bourrin 1h manuellement je voulais vous consulter pour savoir quelles solutions je pourrais avoir pour corriger cela ?
    Ou alors si vous avez des idées pour faire ce que je veux faire plus simplement je suis preneur !
    En Janvier, on est à l'heure d'hiver.
    Une heure du mat' CET, c'est bel et bien minuit GMT.
    Quel est le problème ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    la seule chose qui semble te poser problème, c'est la représentation textuelle de ta date (plus précisément sa timezone). Dans ce cas, précise la timezone que tu veux utiliser à SimpleDateFormat pour faire la conversion String -> Date. Comem déjà dit 1h01 CET == 0h01 GMT, donc il n'y a aucune erreur de calcul, juste une erreur d'interprétation des résultats par l'opérateur final

  5. #5
    Membre du Club
    Profil pro
    Info
    Inscrit en
    Novembre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Info

    Informations forums :
    Inscription : Novembre 2009
    Messages : 60
    Points : 46
    Points
    46
    Par défaut
    Merci les gars !

    Effectivement, de problème en soi il n'y en a pas je suis en CET donc GMT+1h ... mais à force de tourner en rond je voyais plus trop comment le gérer et puis j'avais vraiment l'impression de me prendre la tête sur du compliqué et me demandais si y'avais pas moyen de faire plus simple.

    Je retiens donc les 2 solutions du timezone et du full-Calendar !

    Thanks !

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

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