Hoe u de JVM-tijdzone instelt

1. Overzicht

De gebruikers van onze applicaties kunnen veeleisend zijn als het om tijdstempels gaat. Ze verwachten dat onze applicaties hun tijdzones automatisch detecteren en tijdstempels in de juiste tijdzone weergeven.

In deze zelfstudie bekijken we verschillende manieren waarop we de tijdzone van de JVM kunnen wijzigen. We zullen ook meer te weten komen over enkele van de valkuilen die gepaard gaan met het beheren van de tijdzone.

2. Inleiding tot tijdzone

Standaard leest de JVM tijdzonegegevens van het besturingssysteem. Deze informatie wordt doorgegeven aan het Tijdzone class, die de tijdzone opslaat en de zomertijd berekent.

We kunnen de methode noemen getDefault, waarmee de tijdzone wordt geretourneerd waarin het programma wordt uitgevoerd. Bovendien kunnen we een lijst met ondersteunde tijdzone-ID's verkrijgen van de applicatie met TimeZone.getAvailableIDs ().

Bij het benoemen van de tijdzone vertrouwt Java op de naamgevingsconventie van het tz-database.

3. De tijdzone wijzigen

In dit gedeelte gaan we kijken naar verschillende manieren waarop we de tijdzone in de JVM kunnen wijzigen.

3.1. Een omgevingsvariabele instellen

Laten we beginnen met te kijken hoe we een omgevingsvariabele kunnen gebruiken om de tijdzone te wijzigen. We kunnen een omgevingsvariabele toevoegen of wijzigen TZ.

In Linux-omgevingen kunnen we bijvoorbeeld de exporteren opdracht:

export TZ = "America / Sao_Paulo"

Na het instellen van de omgevingsvariabele, kunnen we zien dat de tijdzone van onze actieve applicatie nu is Amerika / Sao_Paulo:

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

3.2. Een JVM-argument instellen

Een alternatief voor het instellen van een omgevingsvariabele is het instellen van het JVM-argument user.timezone. Dit JVM-argument heeft voorrang op de omgevingsvariabele TZ.

We kunnen bijvoorbeeld de vlag gebruiken -D wanneer we onze applicatie uitvoeren:

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

Evenzo kunnen we ook het JVM-argument van de applicatie instellen:

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

We kunnen nu zien dat de tijdzone Azië / Calcutta is:

Calendar calendar = Calendar.getInstance (); assertEquals (calendar.getTimeZone (), TimeZone.getTimeZone ("Azië / Kolkata"));

3.3. De tijdzone instellen vanuit de applicatie

Ten slotte kunnen we ook de JVM-tijdzone wijzigen vanuit de applicatie met behulp van de Tijdzone klasse. Deze benadering heeft voorrang op zowel de omgevingsvariabele als het JVM-argument.

Het instellen van de standaardtijdzone is eenvoudig:

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

Zoals verwacht is de tijdzone nu Portugal:

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

4. Valkuilen

4.1. Gebruik van drieletterige tijdzone-ID's

Hoewel het mogelijk is om ID's van drie letters te gebruiken om de tijdzone weer te geven, wordt dit niet aanbevolen.

In plaats daarvan zouden we de langere namen moeten gebruiken, aangezien de drieletterige ID's dubbelzinnig zijn. IST kan bijvoorbeeld India Standard Time, Irish Standard Time of Israel Standard Time zijn.

4.2. Algemene instellingen

Merk op dat elk van de bovenstaande benaderingen de tijdzone globaal instelt voor de gehele applicatie. In moderne toepassingen is het instellen van de tijdzone echter vaak genuanceerder dan dat.

We moeten bijvoorbeeld de tijd waarschijnlijk vertalen naar de tijdzone van de eindgebruiker, en dus zou een globale tijdzone niet veel zin hebben. Als een algemene tijdzone niet nodig is, kunt u overwegen om de tijdzone rechtstreeks op elke datum-tijdinstantie op te geven. Een van beide ZonedDateTime of OffsetDateTime is hiervoor een handige les.

5. Conclusie

In deze tutorial hebben we verschillende manieren uitgelegd om de tijdzone van de JVM te wijzigen. We zagen dat we ofwel een systeembrede omgevingsvariabele konden instellen, een JVM-argument konden wijzigen of het programmatisch konden wijzigen vanuit onze applicatie.

Zoals gewoonlijk zijn alle voorbeelden die in dit artikel worden gebruikt, beschikbaar op GitHub.


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