Comment définir correctement un fuseau horaire JVM


96

J'essaie d'exécuter un programme Java, mais il prend un fuseau horaire GMT par défaut au lieu d'un fuseau horaire défini par le système d'exploitation. Ma version JDK est 1.5 et le système d'exploitation est Windows Server Enterprise (2007)

Windows a un fuseau horaire Central spécifié, mais lorsque j'exécute le programme suivant, il me donne une heure GMT.

import java.util.Calendar; 

public class DateTest 
{ 
    public static void main(String[] args) 
    { 
     Calendar now = Calendar.getInstance(); 
     System.out.println(now.getTimeZone()); 
     System.out.println(now.getTime()); 
    } 
} 

Voici la sortie

sun.util.calendar.ZoneInfo[id="GMT", 
offset=0, 
dstSavings=0, 
useDaylight=false, 
transitions=0, 
lastRule=null] 
Mon Mar 22 13:46:45 GMT 2010 

S'il vous plaît noter que je ne veux pas définir le fuseau horaire de l'application. Je veux que le fuseau horaire utilisé par JVM soit celui spécifié dans le système d'exploitation. (Je ne trouve pas ce problème avec d'autres serveurs qui ont la version 1.4 de JDK et Microsoft Server 2003).

Toutes les pensées seraient très appréciées.

+1

Hm, qui est étrange. Cela ressemble à un bogue JVM/OS ou à une mauvaise configuration bizarre. 22 mars. 102010-03-22 16:28:09

  0

Comment invoquez-vous la classe 'DateTest'? 22 mars. 102010-03-22 16:29:39

  0

@matt b: Je compile et j'appelle DateTest depuis l'invite de commande Windows. Mais ce n'est qu'une classe de test. Le problème original était avec un processus ETL pour IBM Cognos Server. 22 mars. 102010-03-22 19:04:44

+1

Je voulais simplement exclure le lancement à travers des scripts shell/batch qui pourraient passer le long d'une valeur «-Duser.timezone» 22 mars. 102010-03-22 19:11:38

155

Vous pouvez passer la machine virtuelle Java ce param

-Duser.timezone 

Par exemple

-Duser.timezone=Europe/Sofia 

et cela devrait faire l'affaire. Définition de la variable d'environnement TZ fait également l'affaire sous Linux.

  0

Nous devions utiliser l'outil de mise à jour JDK DST Timezone - 1.3.25 (tzupdater), puis changer la JVM paramètre que vous avez suggéré et nous avons finalement éliminé le problème. Par ailleurs, les informations de fuseau horaire sont stockées par Windows dans certains registres. Le programme de mise à jour que j'ai utilisé a également mis à jour les valeurs de registre. 25 mars. 102010-03-25 21:17:30

+1

J'essaie de démarrer ma machine virtuelle Java en utilisant ce paramètre, mais ne semble pas avoir de changement ... Si je veux commencer sur UTC, que dois-je utiliser comme paramètre? 19 mai. 112011-05-19 21:43:46

+4

Essayez java -Duser.timezone = GMT ... 19 mai. 112011-05-19 22:00:30

  0

Dans mon application, je suis en train de changer certains endroits et d'obtenir des fuseaux horaires de ces endroits.En utilisant le fuseau horaire, je suis en train de traiter plus loin.Mais lorsque l'application démarre pour la première fois, valeurs. Lorsque je change le fuseau horaire et que je le mets à jour en tant que fuseau horaire par défaut, je ne reçois pas les bonnes valeurs. Quel est le problème? Comment modifier le fuseau horaire exactement.Je change le fuseau horaire en utilisant TimeZone.setDefault (TimeZone.getTimeZone ("my_time_zone")); 20 août. 122012-08-20 14:40:58

+1

@Castanho -Duser.timezone = UTC a fonctionné pour moi 20 sept.. 132013-09-20 01:50:14

  0

Une liste des fuseaux horaires pour TZ est ici: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. L'utilisation du nom du fuseau horaire est meilleure que celle du décalage car elle gère l'heure d'été. 15 mai. 172017-05-15 01:05:26


21

La réponse acceptée ci-dessus:

-Duser.timezone="Europe/Sofia" 

n'a pas fonctionné pour moi exactement. Je n'ai pu changer avec succès mon fuseau horaire quand je n'ai pas entre guillemets les paramètres:

-Duser.timezone=Europe/Sofia 
+2

Je suis d'accord. J'ai édité la réponse originale pour enlever les citations. 17 juil.. 152015-07-17 13:00:34


0

En win7, si vous souhaitez définir le fuseau horaire correct en tant que paramètre dans JRE, vous devez éditer le fichier deployment.properties stocké dans le chemin c:\users\%username%\appdata\locallow\sun\java\deployment ajouter la chaîne deployment.javaws.jre.1.args=-Duser.timezone\=my_time_zone

  0

Je l'ai essayé et cela ne fonctionne pas (jvm exécuté à partir de intelij) 03 mai. 152015-05-03 12:16:51

  0

@Dave Pas du tout de travail .... 03 mars. 162016-03-03 10:11:04


9

sur windows 7 et pour JDK6, je devais ajouter -Duser.timezone="Europe/Sofia" à la variable système JAVA_TOOL_OPTIONS situé sous « Mon ordinateur => Propriétés => Paramètres système avancés => variables d'environnement ".

Si vous avez déjà défini d'autres propriétés pour JAVA_TOOL_OPTIONS, ajoutez simplement un espace, puis insérez votre chaîne de propriété.


2

Si vous utilisez Maven:

mvn -Dexec.args="-Duser.timezone=Europe/Sofia ....." 

31

Vous pouvez également définir le fuseau horaire par défaut dans votre code en utilisant le code suivant.

TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 

au vôtre

TimeZone.setDefault(TimeZone.getTimeZone("Europe/Sofia")); 
  0

"S'il vous plaît noter que je ne veux pas définir le fuseau horaire de l'application." 02 nov.. 172017-11-02 14:00:54