web-dev-qa-db-fra.com

Comment définir un fuseau horaire JVM correctement

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 du 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 l'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

Veuillez noter que je ne souhaite pas définir le fuseau horaire de l'application. Je souhaite que le fuseau horaire utilisé par la machine virtuelle Java soit celui spécifié dans le système d'exploitation. (Je ne trouve pas ce problème avec d'autres serveurs dotés de la version 1.4 de JDK et de Microsoft Server 2003).

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

120
Kushal Paudyal

Vous pouvez transmettre à la JVM ce paramètre

-Duser.timezone

Par exemple

-Duser.timezone=Europe/Sofia

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

192
Bozhidar Batsov

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

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

A la votre

 TimeZone.setDefault(TimeZone.getTimeZone("Europe/Sofia"));
52
Ali786

La réponse acceptée ci-dessus:

-Duser.timezone="Europe/Sofia" 

Cela n'a pas fonctionné pour moi exactement. Je n'ai réussi à changer mon fuseau horaire que lorsque je n'avais pas de guillemets autour des paramètres:

-Duser.timezone=Europe/Sofia
21
WN4yhihiY

Sous Windows 7 et pour JDK6, je devais ajouter -Duser.timezone="Europe/Sofia" à la variable système Java_TOOL_OPTIONS située sous "Poste de travail => Propriétés => Paramètres système avancés => Variables d'environnement".

Si vous avez déjà défini une autre propriété pour Java_TOOL_OPTIONS ajoutez simplement un espace puis insérez votre chaîne de propriété.

10
VolkanT

Si vous utilisez Maven :

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

Deux options que je ne pense pas ont été abordées dans les autres réponses:

Éviter le besoin

Quoi que vous fassiez pour définir le fuseau horaire par défaut de la machine virtuelle Java, il est très difficile de s’assurer que personne ne le définit différemment. Il peut être défini à tout moment sans préavis à partir d'une autre partie de votre programme ou d'un autre programme exécuté sur la même machine virtuelle. Ainsi, dans vos opérations temporelles, indiquez clairement le fuseau horaire que vous souhaitez et vous saurez toujours ce que vous obtenez indépendamment du paramètre JVM. Exemple:

    System.out.println(ZonedDateTime.now(ZoneId.of("Asia/Dushanbe")));

Exemple de sortie:

2018-10-11T14: 59: 16.742020 + 05: 00 [Asie/Douchanbé]

System.setProperty

Dans de nombreux cas, ce qui suit ne sera pas le moyen privilégié et il peut certainement être mal utilisé. Pour les programmes "à jeter", je trouve parfois cela pratique. Vous pouvez également définir une propriété système à partir de Java:

    System.setProperty("user.timezone", "Australia/Tasmania");
    System.out.println(ZonedDateTime.now());

Ceci vient d’être imprimé:

2018-10-11T21: 03: 12.218959 + 11: 00 [Australie/Tasmanie]

Si vous voulez valider la chaîne que vous passez, utilisez:

        System.setProperty("user.timezone", ZoneId.of("Australia/Tasmania").getId());
2
Ole V.V.

Dans win7, si vous souhaitez définir le fuseau horaire correct comme paramètre dans JRE, vous devez modifier le fichier deployment.properties enregistré dans le chemin c:\users\%username%\appdata\locallow\Sun\Java\deployment en ajoutant la chaîne deployment.javaws.jre.1.args=-Duser.timezone\= my_time_zone

0
Dave