Sådan indstilles JVM-tidszonen

1. Oversigt

Brugerne af vores applikationer kan være krævende, når det kommer til tidsstempler. De forventer, at vores applikationer automatisk registrerer deres tidszoner og viser tidsstempler i den korrekte tidszone.

I denne vejledning ser vi på flere måder, hvorpå vi kan ændre tidszonen for JVM. Vi lærer også om nogle af de faldgruber, der er forbundet med styring af tidszonen.

2. Introduktion til tidszone

Som standard læser JVM tidszoneoplysninger fra operativsystemet. Disse oplysninger sendes til Tidszone klasse, der gemmer tidszonen og beregner sommertid.

Vi kan kalde metoden getDefault, som returnerer den tidszone, hvor programmet kører. Desuden kan vi få en liste over understøttede tidszone-id'er fra applikationen ved hjælp af TimeZone.getAvailableIDs ().

Ved navngivning af tidszonen er Java afhængig af navngivningskonventionen for tz-database.

3. Ændring af tidszone

I dette afsnit vil vi se på flere måder, hvorpå vi kan ændre tidszonen i JVM.

3.1. Indstilling af en miljøvariabel

Lad os begynde med at se, hvordan vi kan bruge en miljøvariabel til at ændre tidszonen. Vi kan tilføje eller ændre en miljøvariabel TZ.

For eksempel i Linux-baserede miljøer kan vi bruge eksport kommando:

eksport TZ = "America / Sao_Paulo"

Efter indstilling af miljøvariablen kan vi se, at tidszonen for vores kørende applikation nu er Amerika / Sao_Paulo:

Kalenderkalender = Calendar.getInstance (); assertEquals (calendar.getTimeZone (), TimeZone.getTimeZone ("America / Sao_Paulo"));

3.2. Indstilling af et JVM-argument

Et alternativ til at indstille en miljøvariabel er at indstille JVM-argumentet user.timezone. Dette JVM-argument har forrang over miljøvariablen TZ.

For eksempel kan vi bruge flag -D når vi kører vores ansøgning:

java -Duser.timezone = "Asien / Kolkata" com.company.Main

På samme måde kan vi også indstille JVM-argumentet fra applikationen:

System.setProperty ("user.timezone", "Asia / Kolkata");

Vi kan nu se, at tidszonen er Asia / Kolkata:

Kalenderkalender = Calendar.getInstance (); assertEquals (kalender.getTimeZone (), TimeZone.getTimeZone ("Asien / Kolkata"));

3.3. Indstilling af tidszone fra applikationen

Endelig kan vi også ændre JVM-tidszonen fra applikationen ved hjælp af Tidszone klasse. Denne tilgang har forrang over både miljøvariablen og JVM-argumentet.

Det er let at indstille standardtidszonen:

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

Som forventet er tidszonen nu Portugal:

Kalenderkalender = Calendar.getInstance (); assertEquals (kalender.getTimeZone (), TimeZone.getTimeZone ("Portugal"));

4. Fallgruber

4.1. Brug af tidsbogstavs-id'er på tre bogstaver

Selvom det er muligt at bruge ID'er på tre bogstaver til at repræsentere tidszonen, anbefales det ikke.

I stedet skal vi bruge de længere navne, da ID'erne med tre bogstaver er tvetydige. F.eks. Kunne IST være enten indisk standardtid, irsk standardtid eller israelsk standardtid.

4.2. Globale indstillinger

Bemærk, at hver af ovenstående fremgangsmåder indstiller tidszonen globalt for hele applikationen. I moderne applikationer er det imidlertid mere nuanceret end det at indstille tidszonen.

For eksempel er vi sandsynligvis nødt til at oversætte tid til slutbrugerens tidszone, og så ville en global tidszone ikke give meget mening. Hvis der ikke er behov for en global tidszone, kan du overveje at specificere tidszonen direkte på hver dato-tidsinstans. Enten ZonedDateTime eller OffsetDateTime er en praktisk klasse til dette.

5. Konklusion

I denne vejledning forklarede vi flere måder at ændre JVM's tidszone på. Vi så, at vi enten kunne indstille en systemdækkende miljøvariabel, ændre et JVM-argument eller ændre det programmatisk fra vores applikation.

Som sædvanligt er alle eksemplerne i denne artikel tilgængelige på GitHub.