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.
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.
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"));
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
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é.
Si vous utilisez Maven :
mvn -Dexec.args="-Duser.timezone=Europe/Sofia ....."
Deux options que je ne pense pas ont été abordées dans les autres réponses:
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é]
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());
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