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

avec Java Discussion :

[Problème Heure] Passage à l'heure dété


Sujet :

avec Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 75
    Points : 61
    Points
    61
    Par défaut [Problème Heure] Passage à l'heure dété
    Bonjour à tous,

    Voici mon problème: je reçois une date du serveur. Elle est toujours en GMT.
    Donc pour la transformer j'utilise la TimeZone. Par contre, il ne reprend pas la bonne heure. Il ne tient pas compte du passage à l'heure d'été.
    Exemple:
    Date Serveur: Wed Apr 10 12:36:35 HAEC 2013
    TimeZone : [Europe/Luxembourg,mRawOffset=3600000,mUseDst=true]
    Date Modifier: Wed Apr 10 13:36:55 HAEC 2013

    Alors qu'il est 14:36.

    Et voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    date=(new SimpleDateFormat(pattern)).parse((String) recu.get("server_date"));
    TimeZone zone =TimeZone.getDefault();
    date.setTime(date.getTime()+zone.getRawOffset());
    D'avance Merci
    Guillaume

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 75
    Points : 138
    Points
    138
    Par défaut
    Essaye de mettre directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TimeZone tz = TimeZone.getTimeZone("Europe/Paris");

  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
    C'est un peu dommage que le serveur communique des dates en GMT tout en prétendant qu'elles sont en HAEC (nom francisé de l'heure d'été de Paris.)
    C'est quand même pas la même chose, HAEC c'est GMT+02.

    Mais bon, si on sait que le serveur ment, on peut le gérer avec le SimpleDateFormat chargé de parser la date.

    Mais ce n'est pas à coup de getRawOffset() qu'il faut le faire. Une date c'est toujours la même date que ce soit en GMT ou à Paris. Elle s'écrit pas pareil dans un cas ou dans l'autre, mais l'objet Date qui la représente, c'est le même.
    La différence doit se faire au moment du parsing et du formatting de cette Date. Il ne faut pas faire de calcul d'offset.

    Donc, ce serait plutôt :

    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
    String dateTemplate = "E MMM d HH:mm:ss 'HAEC' yyyy";
    Locale dateLocale = Locale.US;
     
    DateFormat parser = new SimpleDateFormat(dateTemplate, dateLocale);
    // template qui indique HAEC et time zone réelle GMT => GROS MENSONGE !!
    parser.setTimeZone(TimeZone.getTimeZone("GMT"));
     
    DateFormat formatter =  new SimpleDateFormat(dateTemplate, dateLocale);
    // Vu qu'on annonce HAEC et que cette fois on ne ment pas, s'assurer qu'on donne GMT+2
    formatter.setTimeZone(TimeZone.getTimeZone("GMT+2"));
     
    String serverDate = "Wed Apr 10 12:36:35 HAEC 2013";
    System.out.println(serverDate);
     
    Date date = parser.parse(serverDate);
    String clientDate = formatter.format(date);
    System.out.println(clientDate);
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Je vais reprendre, je n'ai à mon avis pas été assez précis.

    Je récupère une heure de mon serveur:
    Wed Apr 10 12:36:35 HAEC 2013 ( cette heure est en GMT)

    Sur mon client, je dois connaitre le fuseau horaire du client.
    Et rajouter simplement la différence entre mon heure du serveur et celle du client.

    Ainsi par exemple en GTM+1 j' ajoute une heure, en GTM +2 j' ajoute 2h.

    Seulement le problème rencontré se situe au niveau des heures d'été. Comment savoir que c'est GTM+2 en été et que c'est GTM+1 en hiver.

    D'avance merci

  5. #5
    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 Guispeed4262 Voir le message
    Je récupère une heure de mon serveur:
    Wed Apr 10 12:36:35 HAEC 2013 ( cette heure est en GMT)
    Et c'est un peu dommage vu qu'elle indique HAEC et que cela signifie GMT+02.
    Le serveur ment, donc.

    Citation Envoyé par Guispeed4262 Voir le message
    Sur mon client, je dois connaitre le fuseau horaire du client.
    Et rajouter simplement la différence entre mon heure du serveur et celle du client.
    Comme je l'ai déjà dit, une Date c'est une Date. C'est la même en GMT, à Paris ou sur la lune. Ce qui change c'est comment on l'écrit : en GMT on dit 12h alors qu'à Paris on dirait 14h.
    La Date est la même, mais la façon de l'écrire dépend de la TimeZone dans laquelle on veut l'écrire.

    "Ajouter deux heures," c'est donc le travail de celui qui écrit la Date sous forme de String, autrement dit c'est le travail du SimpleDateFormat.

    Il suffit de créer un SimpleDateFormat qui utilise la TimeZone du serveur (donc, si le serveur utilise GMT, la TimeZone GMT.)
    Et de s'en servir pour parser la String du serveur en Date.
    Puis de créer un autre SimpleDateFormat qui utilise la TimeZone du client (par exemple "Europe/Paris") et de s'en servir pour transformer la Date en String.
    Il sait pertinemment comment appliquer les règles d'heure d'été/heure d'hiver.

    A noter que si cette transformation en String contient à nouveau HAEC, ça ne sera la vérité que quand la TimeZone est équivalente à GMT+02, donc à Paris, ça ne sera vrai que pendant l'heure d'été. Le reste du temps HAEC sera un gros mensonge, comme avec le serveur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Ok je comprends mieux. Par contre la TimeZone peut varier en fonction de l'utilisateur, comment la récupérer ?
    Car Si je fais un Timezone.getDefault, il me donne Europe/Luxembourg

    Et donc me donne 2 heure de plus que l'heure du serveur.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Points : 533
    Points
    533
    Par défaut
    Bonjour,
    Comme Thelvin t'a indiqué, l'heure est toujours la même. Pour enregistrer l'heure, tu utilises GMT+0 car tu la reçois comme cela.

    par contre chaque ordi client qui affichera cette date affiche les dates avec le bon decalage horaire par défault en fonction de la zone où il se trouve donc nul besoin de reparamétrer le TimeZone pour l'affichage.

    revoici le code de Thelvin légèrement modifié :

    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
    25
    26
    27
    28
     
    import java.util.*;
    import java.text.*;
     
    public class EssaiDate {
     
    	public static void main(String[] args) {
    		String dateTemplate = "E MMM d HH:mm:ss 'HAEC' yyyy";
    		Locale dateLocale = Locale.US;
     
    		DateFormat parser = new SimpleDateFormat(dateTemplate,dateLocale);
    		parser.setTimeZone(TimeZone.getTimeZone("GMT"));
     
     
    		DateFormat formatter =  new SimpleDateFormat(dateTemplate);
    		String serverDate = "Wed Apr 10 12:36:35 HAEC 2013";
     
     
     
    		System.out.println(serverDate);
    		try {
    			Date date = parser.parse(serverDate);
    			String clientDate = formatter.format(date);
    			System.out.println(clientDate);
    		}
    		catch (ParseException e) {System.out.println("erreur");}
    	}
    }

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/06/2013, 04h31
  2. Réponses: 2
    Dernier message: 06/02/2013, 14h13
  3. [phpMyAdmin] problème au niveau des heures avec phpMyAdmin
    Par arti2004 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 13/06/2006, 22h05
  4. Passage à l'heure d'hiver
    Par cchatelain dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 1
    Dernier message: 05/11/2005, 20h52

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