Java >> Java opplæring >  >> JVM

Hvordan stille inn JVM-tidssonen

Lær å angi standard tidssone som brukes av JVM ved hjelp av en miljøvariabel, JVM-argument og TimeZone klasse.

1. Oversikt

Brukerne av enhver applikasjon ønsker å se datoene og tidsstemplene i sin lokale tidssone, og ingen liker å gjøre tidssonejusteringer i tankene deres.

For å vise lokale datotidsstempler til brukere, må tidssonen som brukes av JVM være forutsigbar og helst fast. Det gjør applikasjonens enhetstesting og integrasjonstesting, angående tidssonespesifikke tidsstempler, enkel og mer pålitelig.

Å angi JVM-tidssonen er mer nødvendig i de distribuerte distribusjonsmodellene der applikasjonen kjører på tvers av flere datasentre rundt om i verden, og JVM-er i hvert datasenter kan ha en annen tidssone.

  • Som standard leser JVM tidssoneinformasjon fra operativsystemet og lagrer den i TimeZone klasse.
  • For å få standard tidssone satt i JVM ved hjelp av metoden TimeZone.getDefault() .
  • For å få listen over alle støttede tidssoner, bruk metoden TimeZone.getAvailableIDs() .
  • Java bruker navnekonvensjonen til tz-databasen.

2. Hvordan stille inn tidssonen for JVM

2.1. Angi miljøvariabel 'TZ'

Angi miljøvariabelen TZ som JVM kan bruke for å få standard tidssone i JVM.

I Linux kan vi bruke export kommando.

export TZ="Asia/Kolkata"

I Windows kan vi angi tidssonen som diskutert ved å bruke Control Panel -> Date and Time -> Change Time Zone -> Select your preferred time zone alternativ.

Etter å ha satt miljøvariabelen, kan vi verifisere den i vårt Java-program.

TimeZone timezone = TimeZone.getDefault();
System.out.printf("DisplayName = %s, ID = %s, offset = %s",
        timeZone.getDisplayName(),timeZone.getID(),timeZone.getRawOffset());

Programutgang.

DisplayName = Coordinated Universal Time, ID = UTC, offset = 0

2.2. Angi JVM-argument eller systemegenskap «user.timezone»

Hvis det ikke er mulig å angi miljøvariabelen, kan vi sette tidssonen ved å bruke JVM-argumentet -Duser. timezone . Ikke skriv tidssoneverdien i doble anførselstegn .

java -Duser.timezone=UTC com.app.Main 
//or
java -Duser.timezone=Asia/Kolkata com.app.Main 

Det samme argumentet kan vi sette ved å bruke systemegenskapen "user.timezone" .

System.setProperty("user.timezone", "UTC");

Nå kan vi bekrefte den oppdaterte tidssoneverdien i Java-programmene.

TimeZone timezone = TimeZone.getDefault();
System.out.printf("DisplayName = %s, ID = %s, offset = %s",
        timeZone.getDisplayName(),timeZone.getID(),timeZone.getRawOffset());

Programutgang.

DisplayName = Coordinated Universal Time, ID = UTC, offset = 0

2.3. TimeZone.setDefault()

En annen måte som ligner på å angi systemegenskap er ved å angi standard tidssone direkte i TimeZone klasse.

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

Verifisering av tidssoneverdien vil gi samme resultat som i de tidligere teknikkene.

3. Hvordan JVM løser tidssonen

Som standard velger Java Dato- og Tidsklasser tidssoneinformasjonen fra operativsystemet. Måten JVM løser OS-tidssonen på, er forskjellig i hvert operativsystem.

En måte å få maskinens tidssone på er fra systemklokken og endre ønsket tidssone i klokken. Men denne tilnærmingen er ikke mulig i skymiljøet der ressurser gjøres tilgjengelig på forespørsel.

Vi kan endre verdien av tidssonen med runtime JVM-argumentene og Java-setningene i appen.

Merk at:

  • TZ miljøvariabel, hvis tilgjengelig, overstyrer systemets standard tidssone.
  • JVM-argument -Duser.timezone overstyrer TZ miljøvariabel.
  • TimeZone.setDefault() overstyrer -Duser.timezone argument.

4. Gode ​​fremgangsmåter

  • Aldri stol på standardsonen til maskinen . Spesifiser alltid ønsket/forventet tidssone ved å bruke en av de ovennevnte teknikkene.
  • En applikasjon kan ha tidssonesensitive tidsstempler der applikasjonen etter å ha distribuert applikasjonen i et skymiljø kan flyttes til forskjellige datasentre uten at vi vet det. For å unngå disse inkonsekvensene, anbefales det å angi JVM-tidssonen ved å bruke -Duser.timezone systemegenskap.
  • Hvis vårt krav er å bruke en tidssone ikke bare av JVM, men også for alle underordnede prosesser , for eksempel IDEer, så å angi TZ-miljøvariabelen er mer fornuftig . Et godt eksempel på det er å sette denne variabelen når du starter Eclipse, og så har du den i alle JVM-er startet av Eclipse.
  • Vi bør foretrekke å bruke de lengre navnene på tidssonene i stedet for ID-ene på tre bokstaver. Det er korte IDS som dupliseres mellom flere tidssoner. For eksempel IST kan være enten India Standard Time , irsk standardtid eller Israel Standard Time .

5. Konklusjon

I denne opplæringen lærte vi å sette standard tidssone brukt av JVM i Unix og Windows operativsystemer.

Som en beste praksis bør du alltid angi standard tidssone enten på JRE-nivå eller applikasjonsnivå for å få konsistente og forventede tidsstempler.

God læring !!


Java Tag