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 :

[TimeZone] Comment java récupère les infos ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut [TimeZone] Comment java récupère les infos ?
    Bonjour,

    J'ai constaté un bug très spécifique sur les fuseaux horaires en Java sous Windows.

    Le programme tourne en Nouvelle-Calédonie donc en GMT+11.
    En Nouvelle-Calédonie, il n'y a actuellement pas d'heure d'été.

    Lorsqu'on exécuté le programme, sur certaines dates, un décalage de moins une heure se produisait. Le 01/01/1978 fait parmi des dates concernées.

    Sur le serveur, voici la date récupérée (DateFormat utilisé : "dd/MM/yyyy HH:mm:ss Z zzzz)
    01/01/1978 00:00:00 +1200 Heure d'été de Nouvelle-Calédonie
    Tandis que sur le client la même date est :
    31/12/1977 23:00:00 +1100 Heure des îles Salomon
    Le fuseau horaire Nouvelle-Calédonie et le même que celui des îles Salomon.

    Après quelques recherches, il s'avère que l'heure d'été était actif en Nouvelle-Calédonie en 78. Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println("DST 01/01/1978 = " + TimeZone.getDefault().inDaylightTime(new GregorianCalendar(1978, Calendar.JANUARY, 1).getTime()));
    M'affiche true sous Linux avec JRE 1.5.0_06, mais false sous Windows (même version de JRE)

    Donc j'aimerai savoir si la jvm s'appuie sur le système pour déterminer cette info? Si oui pourquoi sun fait des maj de time zone régulièrement ?

    A+
    Gronono

  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
    la jvm s'appuie sur l'os pour déterminer la timezone courante. Par contre, tous ses calculs de date sont purement internes.

  3. #3
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    La timezone est la bonne dans les deux jvms (client et serveur). C'est GMT+11.

    Par contre lorsque ma date (avec la TZ à GMT+12) arrive (via RMI) coté client, elle est convertie en GMT+11. Donc il y a une perte d'une heure.

    Normalement, elle devrait être convertie en GMT+12 puisque en 1978 l'heure d'été était active.

    A+
    Gronono

  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
    Citation Envoyé par gronono Voir le message
    La timezone est la bonne dans les deux jvms (client et serveur). C'est GMT+11.

    Par contre lorsque ma date (avec la TZ à GMT+12) arrive (via RMI) coté client, elle est convertie en GMT+11. Donc il y a une perte d'une heure.
    C'est pas comme çà que çà marche, la date, en elle même, n'a pas de timezone. Elle n'est donc pas convertie lors du passage sur RMI. C'est uniquement lors de sa convertion de et vers des strings que la timezone est utilisée.

    De plus, GMT+11 en lui même ne défini pas entièrement une timezone. Comme tu l'as précisé dans ton premier post, sur une des machines la timezone est "Nouvelle-Calédonie" et sur l'autre la timezone est "îles Salomon".

    Quand tu travaille en client/serveur, le mieux est de se mettre d'accord sur une timezone précise à utiliser des deux cotés. Ensuite, pour tous tes appels à DateFormat, passer cette timezone pour être certains que la locale (Timezone.getDefault()) de la machine ne soit pas prise en compte.

    Pour te donner un exemple, ici, j'avais une application en JSF, le serveur était sur GMT, les utilisateurs sur Europe/Brussel. Résultat, perte de 1 à 2 heure suivant la période de l'année. Comme je sauvais des "dates" sur la db oracle, 1h de décalage, par rapport à minuit, çà change carrément de jour, comme oracle tronque les heure (pas besoin pour les "date", à chaque cycle de charger / modifier / sauver, je perdais un jour sur tous mes champs dates . La solution a été d'imposer partout une timezone explicite (Europe/Brussel), y compris sur le connecteur db

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par tchize_ Voir le message
    C'est pas comme çà que çà marche, la date, en elle même, n'a pas de timezone. Elle n'est donc pas convertie lors du passage sur RMI. C'est uniquement lors de sa convertion de et vers des strings que la timezone est utilisée.
    +1

    Une date est toujours stocké à l'heure GMT. Ce n'est que lors de l'affichage ou de la création d'une Date que l'on utilise un TimeZone.

    Ainsi ce code ne génèrera pas la même date : cela dépend du timezone par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new GregorianCalendar(1978, Calendar.JANUARY, 1)

    Perso je ne vois donc pas vraiment de problème... mais la gestion des TimeZone est assez complexe

    a++

  6. #6
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    Je viens de relire la discution.
    J'ai fait une petite erreur. Les deux timezones ne sont pas identiques. Elles correspodent toutes deux à GMT+11 mais Pacific/Noumea (ie heure de Nouvelle-Calédonie) et Pacifisc/Guadalcanal (ie heure des îles Solomon n'ont pas le même historique.
    En effet, Pacific/Noumea a bien eu une heure d'été en 1978.

    Le problème est que Windows ne distingue pas les deux fuseaux. Sous linux, on sélectionne le fuseau à partir de la ville (ici Noumea). Mais sous Windows ont sélectionne GMT+11.

    Donc sous Windows, on se retrouve avec le fuseau Pacific/Guadalcanal qui n'a pas d'heure d'été en 1978.

    La solution consiste bien à forcer le fuseau.

    Par contre je croyais que spécifier la locale en fr_NC forçait aussi le fuseau horaire. Mais c'est faux.

    Par contre je ne sais toujours pas comment jvm peut savoir qu'en 1978, il faut utiliser l'heure d'été.

    A+
    Gronono

    Edit : Le convertit par RMI était un peu fort. Je sais bien que le RMI n'y est pour rien. L'important était d'avoir des jvms distinctes pour le client et le serveur. Le test devait alors lieux entre un client windows et un serveur linux comme en production.

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

Discussions similaires

  1. [XSLT 1.0] Comment boucler sur les infos d'un élément précis
    Par Janko dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 18/06/2012, 13h45
  2. Réponses: 5
    Dernier message: 08/09/2011, 10h51
  3. [MySQL] [mysql] Comment bien stocker les infos d'un formulaire dynamique ?
    Par padjoy dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/11/2010, 19h28
  4. Réponses: 2
    Dernier message: 16/03/2009, 16h07
  5. Comment Obtenir en JS les infos d'un objet HTML ?
    Par prin-prin dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/12/2005, 16h50

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