2010-03-22 6 views
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)Comment définir correctement un fuseau horaire JVM

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. –

+0

Comment invoquez-vous la classe 'DateTest'? –

+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. –

Répondre

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. –

+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? –

+4

Essayez java -Duser.timezone = GMT ... –

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. – GaZ

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) – kumetix

+0

@Dave Pas du tout de travail .... –

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." – AbVog

Questions connexes