Hvordan sette JVM-tidssone

1. Oversikt

Brukerne av applikasjonene våre kan være krevende når det gjelder tidsstempler. De forventer at applikasjonene våre oppdager tidssonene sine automatisk og viser tidsstempler i riktig tidssone.

I denne opplæringen tar vi en titt på flere måter vi kan endre tidssonen til JVM. Vi lærer også om noen av fallgruvene forbundet med å administrere tidssonen.

2. Introduksjon til tidssone

Som standard leser JVM tidssoneinformasjon fra operativsystemet. Denne informasjonen blir sendt til Tidssone klasse, som lagrer tidssonen og beregner sommertid.

Vi kan kalle metoden getDefault, som vil returnere tidssonen der programmet kjører. Videre kan vi få en liste over støttede tidssone-IDer fra applikasjonen ved hjelp av TimeZone.getAvailableIDs ().

Når du navngir tidssonen, er Java avhengig av navngivningskonvensjonen til tz database.

3. Endring av tidssone

I denne delen skal vi se på flere måter vi kan endre tidssonen i JVM.

3.1. Angi en miljøvariabel

La oss begynne med å se hvordan vi kan bruke en miljøvariabel til å endre tidssonen. Vi kan legge til eller endre en miljøvariabel TZ.

I Linux-baserte miljøer kan vi for eksempel bruke eksport kommando:

eksporter TZ = "America / Sao_Paulo"

Etter å ha satt inn miljøvariabelen, kan vi se at tidssonen til den kjørende applikasjonen vår er nå Amerika / Sao_Paulo:

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

3.2. Sette et JVM-argument

Et alternativ til å sette en miljøvariabel er å sette JVM-argumentet user.timezone. Dette JVM-argumentet går foran miljøvariabelen TZ.

For eksempel kan vi bruke flagget -D når vi kjører søknaden vår:

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

På samme måte kan vi også angi JVM-argumentet fra applikasjonen:

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

Vi kan nå se at tidssonen er Asia / Kolkata:

Kalenderkalender = Calendar.getInstance (); assertEquals (calendar.getTimeZone (), TimeZone.getTimeZone ("Asia / Kolkata"));

3.3. Angi tidssone fra applikasjonen

Til slutt kan vi også endre JVM-tidssonen fra applikasjonen ved hjelp av Tidssone klasse. Denne tilnærmingen går foran både miljøvariabelen og JVM-argumentet.

Det er enkelt å stille inn standard tidssone:

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

Som forventet er tidssonen nå Portugal:

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

4. Fallgruver

4.1. Bruke ID-er med tre bokstaver

Selv om det er mulig å bruke ID-er på tre bokstaver for å representere tidssonen, anbefales det ikke.

I stedet bør vi bruke de lengre navnene, da ID-er med tre bokstaver er tvetydige. For eksempel kan IST være enten India Standard Time, Irish Standard Time eller Israel Standard Time.

4.2. Globale innstillinger

Merk at hver av de ovennevnte tilnærmingene angir tidssonen globalt for hele applikasjonen. I moderne applikasjoner er det imidlertid mer nyansert å sette tidssonen enn det.

For eksempel trenger vi sannsynligvis å oversette tid til sluttbrukerens tidssone, og slik at en global tidssone ikke ville gi mye mening. Hvis det ikke er behov for en global tidssone, kan du vurdere å spesifisere tidssonen direkte for hver dato-tid-forekomst. Enten ZonedDateTime eller OffsetDateTime er en praktisk klasse for dette.

5. Konklusjon

I denne opplæringen forklarte vi flere måter å endre tidssonen til JVM på. Vi så at vi enten kunne sette en systemomfattende miljøvariabel, endre et JVM-argument eller endre det programmatisk fra applikasjonen vår.

Som vanlig er alle eksemplene som brukes i denne artikkelen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found