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

Services Web Java Discussion :

Comment transmettre une date avec fuseau horaire ?


Sujet :

Services Web Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 53
    Points : 34
    Points
    34
    Par défaut Comment transmettre une date avec fuseau horaire ?
    Bonjour

    J'aimerais savoir comment transmettre une date avec fuseau horaire plutôt qu'une date en UTC dans un appel de web service Axis.

    Le champ représentant ma date est décrit sous forme de dateTime dans le WSDL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsd:element name="dateDebut" nillable="true" type="xsd:dateTime" />
    L'objet Java, généré par wsdl2java, utilisé pour transmettre la date est un objet Calendar.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private java.util.Calendar dateDebut;
    Dans les logs Axis, j'ai les logs suivants pour la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <dateDebut>2012-10-15T13:10:29.514Z</dateDebut>
    Comment faire pour transmettre plutôt une date au format suivant ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <dateDebut>2012-10-15T13:10:29.514-04:00</dateDebut>
    avec -04:00 représentant le fuseau horaire correspondant à l'heure transmise (exemple la Guadeloupe).

    Y a-t-il une option à positionner dans l'objet Calendar à transmettre ?

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Salut,

    Je pense que tu as un souci quelque part

    2012-10-15T13:10:29.514Z
    2012-10-15T13:10:29.514-04:00

    ne représentent pas la même heure, 13:10 zulu c'est 9:10 en -04:00. Ca veut dire que l'objet Calendar que tu passes n'a pas la bonne timezone.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 53
    Points : 34
    Points
    34
    Par défaut
    Oui effectivement ce n'est pas la même date, je l'ai donné en exemple en fait

    Donc comment faire pour transmettre cette date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <dateDebut>2012-10-15T09:10:29.514-04:00</dateDebut>
    J'ai essayé avec le code suivant, mais ça ne fonctionne pas. J'obtiens une date Zulu (avec le Z) et pas avec le fuseau horaire (-04:00) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Calendar dateDebut = Calendar.getInstance(TimeZone.getTimeZone("America/Guadeloupe"));
    maRequete.setDateDebut (dateDebut );
    Y a-t-il une option à positionner dans le calendar ?

  4. #4
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Citation Envoyé par flexx Voir le message
    J'ai essayé avec le code suivant, mais ça ne fonctionne pas. J'obtiens une date Zulu (avec le Z) et pas avec le fuseau horaire (-04:00) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Calendar dateDebut = Calendar.getInstance(TimeZone.getTimeZone("America/Guadeloupe"));
    maRequete.setDateDebut (dateDebut );
    Y a-t-il une option à positionner dans le calendar ?
    Non ce serait le code de sérialization ou de désérialization qu'il faudrait changer. Et il me semble qu'axis force la timezone en UTC.

    En gros tu passes un calendar local a UTC-4, axis t'extrait cette date en heure UTC ce qui te fais perdre le fuseau -4 et ajoute 4h de plus. En fait ce qu'il fait est correct puisqu'il envoie le même instant T en millisecondes.

    Après, la timezone c'est l'interprétation que tu décides de faire de ces millisecondes, mais c'est exactement le même instant. Je sais que c'est pas évident.
    De l'autre côté, chez ton client, si tu veux que l'heure apparaisse comme sur le serveur tu devras ajuster la timezone à UTC-4 et tu retrouveras l heure correcte (enfin il vaut mieux utiliser les timezones de régions pour avoir l heure d'été proprement ajustée)

    En gros si tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Calendar dateDebut = Calendar.getInstance(TimeZone.getTimeZone("America/Guadeloupe"));
    maRequete.setDateDebut (dateDebut );
    qui correspond a 8:00 -4:00

    Il va t'extraire 12:00Z ce qui est équivalent

    Et après désérialization chez le client, tu devras faire un setTimeZone pour retrouver l'heure de départ dans le fuseau horaire que tu spécifies.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 53
    Points : 34
    Points
    34
    Par défaut
    Merci pour ta réponse.

    Donc finalement je me retrouve bloqué à cause d'Axis en fait.

    C'est problématique car en fait, la date et l'heure que j'envoie peuvent correspondre à plusieurs localisation et donc plusieurs fuseaux horaires.

    Je pensais qu'il y avait moyen d'envoyer une date avec le fuseau horaire (le fuseau est important pour le serveur du web service).
    Du coup, pour le faire il faudrait ajouter un champ dans la requête du web service qui contiendra le fuseau par exemple.

  6. #6
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Perso j'ai résolu cela dans un autre système en donnant un clientId à tous mes clients et en configurant côté serveur quel clientId utilise quelle zone.
    Ainsi tout circule en UTC et lorsqu'il est nécessaire de retrouver l'heure locale, ça se fait facilement.

    De toutes façons tu aurais été coincé car le format ISO 8601 indique certes la correction du moment +4:00 +5:00 mais ce n'est pas suffisant pour retrouver le fuseau. Sachant qu'ici en Europe centrale, en juillet tu aurais du +2:00 et en hiver du + 1:00.
    Crois-moi tu perds pas grand chose à ne pas avoir la correction immédiatement dans le fichier xml.

  7. #7
    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
    Je dirais même plus, un instant T, c'est le même partout dans le monde, donc axis travaille correctement. Même mieux, il évite les ambiguité car, certaines représentations écrites dans une timezone respectant été hivers peuvent avoir deux fois la période 1h-2h00 du matin lors d'un changement....

    Si la timezone de départ de ta donnée est une chose importante pour toi (après tout, c'est une information comme une autre), il est préférable de la transmettre séparément. tu aura d'un coté une représentation non ambigue de ton moment et, à coté, la timezone dans laquelle il faudra l'afficher.

Discussions similaires

  1. [DATE] Créer une date selon fuseau horaire
    Par Tomus dans le forum Débuter
    Réponses: 2
    Dernier message: 24/02/2010, 03h30
  2. Réponses: 3
    Dernier message: 19/06/2007, 22h34
  3. [MySQL] comment rechercher une date au format datetime avec une date au format date
    Par Menoly dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/06/2007, 10h14
  4. [Access] Comment créer une requete avec la date
    Par Daniela dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/09/2006, 11h06
  5. Réponses: 3
    Dernier message: 12/07/2006, 09h13

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