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 :

Fonction pour calculer un changement fuseau horaire


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Par défaut Fonction pour calculer un changement fuseau horaire
    Bonjour, bonsoir.

    Je voudrais ecrire une fonction qui fait un changement de fuseau horaire qui se relève plus compliqué que prévue.

    pour l'instant j'en suis la:

    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
     
    private Date convTimeZone(String time, String sourceTZ, String destTZ) throws ParseException {
     
    TimeZone srcTZ = TimeZone.getTimeZone(sourceTZ);
    TimeZone dstTZ = TimeZone.getTimeZone(destTZ);
    final String DATE_TIME_FORMAT = "yyyyMMdd-HH:mm:ss";
     
    SimpleDateFormat sdf = new SimpleDateFormat(DATE_TIME_FORMAT);
    Date specifiedTime;
    sdf.setTimeZone(srcTZ );
     
    specifiedTime = sdf.parse(time);
    sdf.setTimeZone(dstTZ );
    SimpleDateFormat sdf2 = new SimpleDateFormat(DATE_TIME_FORMAT);
     
    Date outputDate = sdf2.parse(sdf.format(specifiedTime));
    return outputDate;
    }

    mais ca ne marche pas...

    genre si j'appel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    convTimeZone("20090202-12:00:00","Asia/Kuala_Lumpur","Europe/Brussels")

    Ca me retourne 13h a la place de 5h (Kuala Lumpur est a GMT+8, et bxl GMT+1 --> 12-7=5)

    Et inversement je voudrais que quand je passe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    convTimeZone("20090202-12:00:00","Europe/Brussels","Asia/Kuala_Lumpur")
    Ca me retourne 19h...

    Et quid des heures d'été et d'hiver?

    j'ai deja trouvé ca comme lien:
    http://mindprod.com/jgloss/timezone.html
    http://www.velocityreviews.com/forum...o-another.html
    et la doc sun:
    http://java.sun.com/j2se/1.4.2/docs/...ateFormat.html

    Mais j'y arrive tjs pas.

    Si qqun voit mon erreur, une piste, un conseil, un avis.
    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Par défaut
    Bon j'ai une methode un peu old school avec un offset:

    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
     
        public static Date convTimeZone(String time, String sourceTZ, String destTZ)
                throws ParseException {
     
            TimeZone srcTZ = TimeZone.getTimeZone(sourceTZ);
            TimeZone dstTZ = TimeZone.getTimeZone(destTZ);
            final String DATE_TIME_FORMAT = "yyyyMMdd-HH:mm:ss";
            SimpleDateFormat sdf = new SimpleDateFormat(DATE_TIME_FORMAT);
            Date date = sdf.parse(time);
     
            System.out.println("decalage src entre " + srcTZ.getID() + " et GMT: " + (srcTZ.getRawOffset() / 60 / 60 / 1000));
            System.out.println("decalage dst entre " + dstTZ.getID() + " et GMT: " + (dstTZ.getRawOffset() / 60 / 60 / 1000));
            System.out.println("decalage src entre " + srcTZ.getID() + " et dst " + dstTZ.getID() + ": " + ((dstTZ.getRawOffset() / 60 / 60 / 1000) - (srcTZ.getRawOffset() / 60 / 60 / 1000)));
     
            int decalage = dstTZ.getRawOffset() - srcTZ.getRawOffset();
            long convertedtime = date.getTime() + decalage;
            Date dateRetrun = new Date();
            dateRetrun.setTime(convertedtime);
            return dateRetrun;
        }
    Mais j'ai pas d'idée comment ca reagis face au heure d'été et d'hiver...

    C'est facile pour convertir l'heure actuelle de la machine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Calendar.getInstance(timeZone);

  3. #3
    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,


    Tu te compliques la tâche inutilement ! Tu n'as pas à faire de conversion de TimeZone !!!

    Une Date est TOUJOURS en GMT, et n'est pas associé à un fuseau en particulier.

    Lorsque tu utilises la méthode DateFormat.parse() tu crées un objet Date en GMT même lorsque tu précise le fuseau horaire. Si tu veux un affichage correct il suffit de formater la date avec le bon timezone.


    Dans ton premier cas tu fais un double parse() inutile, et dans le second tu crée une date GMT incorrect...


    Il suffit simplement de préciser le TimeZone à la création de l'objet Date (pour bien lire la chaine de caractère) et lors de son affichage :
    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
    	private static final String DATE_TIME_FORMAT = "yyyyMMdd-HH:mm:ss";
     
    	public static Date getGMTDate(String time, String timeZone) throws ParseException {
    		final SimpleDateFormat sdf = new SimpleDateFormat(DATE_TIME_FORMAT);
    		sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
    		return sdf.parse(time);
    	}
     
    	public static String getZonedDate(Date date, String timeZone) {
    		final SimpleDateFormat sdf = new SimpleDateFormat(DATE_TIME_FORMAT);
    		sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
    		return sdf.format(date);
    	}
     
     
    	public static void main(String[] args) throws Exception {
     
    		Date date = getGMTDate("20090202-12:00:00", "Asia/Kuala_Lumpur");
     
    		System.out.println(date); // Affiche la date dans le TimeZone par défaut
     
    		String str = getZonedDate(date, "Europe/Brussels");
     
    		System.out.println(str); // Affiche la date formaté par nos soins
    	}
    a++

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Par défaut
    Oui comme ca, ca marche aussi mais je voulais une methode qui fasse tout d'un coup.

    Car la tu envoies l'heure et le timezone src, tu le converties en date (DONC sur un GMT)
    Puis tu converties le gmt de date en dstTZ.

    Enfin bon voila comme ca mainteant c'est clair.

    merchi

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

Discussions similaires

  1. [Débutant] Fonction pour calcul d'une suite récurrente
    Par moimoi89 dans le forum MATLAB
    Réponses: 2
    Dernier message: 31/10/2007, 17h08
  2. Existe-t-il une fonction pour calculer le kurtosis
    Par bichou dans le forum MATLAB
    Réponses: 1
    Dernier message: 19/06/2007, 17h01
  3. fonction pour calculer le temps de processus
    Par torNAdE dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 23/10/2006, 15h54
  4. [Math] Fonction pour calculer Factorielle(n)
    Par Asdorve dans le forum Vos contributions VB6
    Réponses: 2
    Dernier message: 10/08/2006, 21h20
  5. Réponses: 6
    Dernier message: 22/11/2005, 17h08

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