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
overstyrerTZ
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 !!