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 :

valeur d'un objet différent suivant les affichages


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 47
    Points : 37
    Points
    37
    Par défaut valeur d'un objet différent suivant les affichages
    Bonjour à tous,

    je suis en train de développer une application Android qui récupère des logs et qui les envoie à une autre application server en Java.

    Pour simplifier le transfert de logs d'une application à l'autre j'utilise une classe commune. le transfert des logs se passe bien (par socket et par l'intermédiaire de fichiers txt). La récupération coté serveur aussi (les fichiers textes sont tous corrects).

    Mon problème est le suivant. sur mon serveur, je lis les fichiers txt afin de recréer une multitude d'objets Logs.
    Une fois fait, quand j'affiche la méthode .toString() d'un logs, je n'ai pas le même résultat que sur Android.
    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    0 - 09/05/2014- 20:55:20; Aircraft: ABCD-E, 13*343*444; Location: lat. 43.36589587451, lg. 3.125487986565, alt. 5 154m, Speed: 55kt; FlightTime: 558 541 584ms; Airport: ABCD, dist: 15 551m, bearing: -128
     
    0 - 09/06/2014- 18:55:20; Aircraft: ABCD-E, 13*343*444; Location: lat. 43,366, lg. 3,125, alt. 5154m, Speed: 55kt; FlightTime: 558*541*584ms; Airport: ABCD, dist: 15551m, bearing:- 128
    Comme vous pouvez le voir :
    - la date n'est pas la bonne. il s'agit pourtant de la date du jour. Si je fait un .getMonth pour tester, il me retourne bien 05 et non pas 06.
    - l'heure n'est pas la bonne
    - les doubles latitude et longitude ne sont pas inscrit en entier. Si je fait un log.getLatitude() j'ai la valeur complète qui apparaît.
    - l'altitude n'a pas l'espace entre le millier et le cent tout comme la distance.
    - pour le bearing, le chiffre - est décalé du nombre.


    Pour information, les 2 objets affichés plus haut sont fait de la même manière : constructeur complet + affichage de la méthode .toString().
    J'ai l'impression de rater qqchose sur l'affichage server. les variables de l'objet sont correctes mais pas leurs affichages.

    voici ma méthode ToString():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public String 
    	MessageFormat loggerFormat = new MessageFormat("{0} -{1, date, dd/MM/yyyy}-{1, time, HH:mm:ss}; Aircraft: {12}, {13}; {2}; EngineIsOn: {3}; Location: lat. {4}, lg. {5}, alt.{6, number, ####.##}m, Speed: {7}kt; FlightTime: {8}ms; Airport: {9}, dist:{10, number, ###.##}m, bearing:{11, number, ###.##}\n");
     
    	TimeZone tz = TimeZone.getTimeZone("UTC");
    	Object formats[] = loggerFormat.getFormats();
    	((SimpleDateFormat)formats[1]).setTimeZone(tz);		
    	((SimpleDateFormat)formats[2]).setTimeZone(tz);	
    	Object args[] = {code, time, message, engineIsOn, latitude, longitude, altitude, speed, flightTime, airport.getOaciCode(), distance, bearing, aircraftID, aircraftIndex}; 
    	return (loggerFormat.format(args));

    J'utilise un JtextPane pour l'affichage serveur mais en mode console s'est le même problème. Avez vous des pistes? je suis vraiment bloqué là et je sais plus quoi faire.

    Merci par avance. et bon Weekend

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 47
    Points : 37
    Points
    37
    Par défaut
    après plusieurs tests, l'erreur vient de la récupération de la date:

    si je récupère la date à partir d'un String, elle n'est pas la même que si je la récupère d'un long (correspondant au même string)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String s ="09/05/2014-23:45:35"; // à partir d'un string
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy-HH:mm:ss");	
    Date date= new Date();
    date = sdf.parse(s);
     
    elements.add(14, getElement(ligne,"\n", true)); // à partir d'un long
    voilà le résultat que j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1399671935000 // avec string
     
    1399679135597 // avec long
    Je ne vois pas où est le problème.

  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
    Ce qui fait une différence de 2 heures et 597 millisecondes.
    Pour les millisecondes on va dire qu'on s'en fiche, la String n'en indique pas. (Et tu nous as pas dit d'où vient le long, va comprendre pourquoi lui, il en indique. Enfin...)

    Et les deux heures, on peut que supposer, mais c'est le décalage entre Paris, heure d'été, et UTC. Donc certainement une confusion dans les timezones. Je vois que tu définis plusieurs fois la timezone à utiliser, UTC, mais tu l'as peut-être oublié quelque part. Je constate par exemple que tu ne l'as pas indiqué à ton SimpleDateFormat sdf. La date parsée avec sera donc parsée dans la timezone par défaut qui, si tu es en France, a de bonnes changes d'être Paris, pas UTC.

    Mais bon, on y comprend rien à tes histoires. Tu montres pas le code qui génère tes données, ça sert à rien.
    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
    et pour getMonth, les valeur sont comprises entre 0 et 11, donc juin a bien getMonth() qui retourne 5

    Pour le reste, je suppose que la machine android et ton serveur n'ont pas les les mêmes locales, du coup les float , les double et les dates sont affichées différement par toString().

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 47
    Points : 37
    Points
    37
    Par défaut
    le code qui génère l'objet est trop complexe et long pour l'afficher ici.

    d'après ce que j'ai compris j'ai un problème d'affichage des données pour les doubles qui ne s'affiche pas en entier. ce problème est maintenant réglé.

    Le vrai problème viens de la date.
    pour réexpliquer en schématisé :

    1- quand un log se crée je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long time = System.currentTimeMillis();
    2- j'enregistre l 'objet (et donc cette date (time)) dans mon fichier texte par l'intermédiaire de la méthode toString() vu plus haut avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public String toString(){
    	MessageFormat loggerFormat = new MessageFormat("{0} -{1, date, dd/MM/yyyy}-{1, time, HH:mm:ss}; Aircraft: {12}, {13}; {2}; EngineIsOn: {3}; Location: lat. {4}, lg. {5}, alt.{6, number, ####.##}m, Speed: {7}kt; FlightTime: {8}ms; Airport: {9}, dist:{10, number, ###.##}m, bearing:{11, number, ###.##}\n");
     
    	TimeZone tz = TimeZone.getTimeZone("UTC");
    	Object formats[] = loggerFormat.getFormats();
    	((SimpleDateFormat)formats[1]).setTimeZone(tz);		
    	((SimpleDateFormat)formats[2]).setTimeZone(tz);	
    	Object args[] = {code, time, message, engineIsOn, latitude, longitude, altitude, speed, flightTime, airport.getOaciCode(), distance, bearing, aircraftID, aircraftIndex}; 
    	return (loggerFormat.format(args));
    J'obtiens donc dans mon fichier texte une date UTC sous le format : [dd/MM/yyyy-HH:mm:ss]

    3- je récupère mon fichier texte sur un server et je retravaille le string Date ([dd/MM/yyyy-HH:mm:ss]) et c'est la que la date n'est plus correcte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DateFormat indfm = new SimpleDateFormat("dd/MM/yyyy-HH:mm:ss");
    indfm.setTimeZone(TimeZone.getTimeZone("UTC"));
    Date date = dfm.parse("09/05/2014-20:55:20");
    me renvoie: 09/06/2014- 18:55:20

  6. #6
    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
    Citation Envoyé par Nnahaa Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DateFormat indfm = new SimpleDateFormat("dd/MM/yyyy-HH:mm:ss");
    indfm.setTimeZone(TimeZone.getTimeZone("UTC"));
    Date date = dfm.parse("09/05/2014-20:55:20");
    me renvoie: 09/06/2014- 18:55:20
    Non, ça te renvoie un objet de type Date. Pour avoir "09/06/2014- 18:55:20" tu as du le reconvertir en String, c'est probablement là que tu te trompe.


    et indfm ce n'est pas la même variable que dfm !!

  7. #7
    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 Nnahaa Voir le message
    d'après ce que j'ai compris j'ai un problème d'affichage des données pour les doubles qui ne s'affiche pas en entier. ce problème est maintenant réglé.
    Ouais enfin afficher un double en entier, ça fait dans les 50 décimales c'est pas une super idée. Afficher un double avec le nombre voulu de décimales, c'est mieux.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 47
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ouais enfin afficher un double en entier, ça fait dans les 50 décimales c'est pas une super idée. Afficher un double avec le nombre voulu de décimales, c'est mieux.
    Tu as tout à fait raison, il s'agit ici de points GPS limités dans le nombres de décimale mais c'est pas très correct de laisser tel quel. j'ai modifié mon code en conséquence, merci du conseil.

    Citation Envoyé par tchize_ Voir le message
    Non, ça te renvoie un objet de type Date. Pour avoir "09/06/2014- 18:55:20" tu as du le reconvertir en String, c'est probablement là que tu te trompe.


    et indfm ce n'est pas la même variable que dfm !!
    petite erreur de ma part en copiant collant rapidement mon code. il s'agit bien de la même variable indfm en fait. j'ai essayé différentes méthodes pour instancier la date à partir de mon string (calendar, date, décomposition du String ...) mais rien ne change.
    J'ai donc trouvé une solution alternative qui consiste à passer directement dans mes logs un Long correspondant à la date. la Date est ainsi cohérente et correcte. par contre j'ai un objet de plus dans ma ligne de log.

    Merci de votre aide et Bon dimanche

  9. #9
    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
    Citation Envoyé par Nnahaa Voir le message
    j'ai essayé différentes méthodes pour instancier la date à partir de mon string (calendar, date, décomposition du String ...) mais rien ne change.
    En même temps, encore une fois, le problème n'est pas le parsing de la date, mais son affichage par la suite (la conversion date -> string que tu fais après avoir fait string -> date!)

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

Discussions similaires

  1. Valeur du timeout différente suivant les navigateurs ?
    Par GBS63 dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 24/08/2009, 00h03
  2. Réponses: 15
    Dernier message: 19/06/2006, 19h25
  3. Réponses: 2
    Dernier message: 08/05/2006, 21h08
  4. Réponses: 8
    Dernier message: 05/05/2006, 17h47
  5. Action différente suivant les droits
    Par JMLD dans le forum XMLRAD
    Réponses: 2
    Dernier message: 27/04/2005, 17h25

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