Ako nastaviť časové pásmo JVM

1. Prehľad

Používatelia našich aplikácií môžu byť nároční, pokiaľ ide o časové značky. Očakávajú, že naše aplikácie automaticky zistia ich časové pásma a zobrazia časové značky v správnom časovom pásme.

V tomto výučbe sa pozrieme na niekoľko spôsobov, ako môžeme upraviť časové pásmo JVM. Dozvieme sa tiež o niektorých úskaliach spojených s riadením časového pásma.

2. Úvod do časového pásma

Štandardne JVM číta informácie o časových pásmach z operačného systému. Tieto informácie sa odovzdajú Časové pásmo trieda, ktorá ukladá časové pásmo a počíta letný čas.

Môžeme nazvať metódu getDefault, čím sa vráti časové pásmo, kde je spustený program. Ďalej môžeme pomocou aplikácie získať zoznam podporovaných ID časových pásiem TimeZone.getAvailableIDs ().

Pri pomenovávaní časovej zóny sa Java spolieha na konvencie pomenovania tz databáza.

3. Zmena časového pásma

V tejto časti sa pozrieme na niekoľko spôsobov, ako môžeme zmeniť časové pásmo v JVM.

3.1. Nastavenie premennej prostredia

Začnime tým, že uvidíme, ako môžeme pomocou premennej prostredia zmeniť časové pásmo. Môžeme pridať alebo upraviť premennú prostredia TZ.

Napríklad v prostrediach založených na Linuxe môžeme používať export príkaz:

export TZ = "Amerika / Sao_Paulo"

Po nastavení premennej prostredia vidíme, že časové pásmo našej bežiacej aplikácie je teraz America / Sao_Paulo:

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

3.2. Stanovenie argumentu JVM

Alternatívou k nastaveniu premennej prostredia je nastavenie argumentu JVM user.timezone. Tento argument JVM má prednosť pred premennou prostredia TZ.

Napríklad môžeme použiť vlajku -D keď spustíme našu aplikáciu:

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

Rovnako môžeme z aplikácie nastaviť aj argument JVM:

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

Teraz vidíme, že časové pásmo je Ázia / Kalkata:

Calendar calendar = Calendar.getInstance (); assertEquals (calendar.getTimeZone (), TimeZone.getTimeZone ("Ázia / Kalkata"));

3.3. Nastavenie časového pásma z aplikácie

Nakoniec môžeme z aplikácie upraviť aj časové pásmo JVM pomocou Časové pásmo trieda. Tento prístup má prednosť pred premennou prostredia a argumentom JVM.

Nastavenie predvoleného časového pásma je jednoduché:

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

Podľa očakávania je teraz časové pásmo Portugalsko:

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

4. Úskalia

4.1. Používanie trojpísmenových ID časových pásiem

Aj keď je možné na označenie časového pásma použiť trojpísmenové ID, nedoporučuje sa to.

Namiesto toho by sme mali používať dlhšie názvy, pretože trojpísmenové ID sú nejednoznačné. Napríklad IST môže byť buď indický štandardný čas, írsky štandardný čas alebo izraelský štandardný čas.

4.2. Globálne nastavenia

Upozorňujeme, že každý z vyššie uvedených prístupov globálne nastavuje časové pásmo pre celú aplikáciu. V moderných aplikáciách je však nastavenie časového pásma často jemnejšie ako to.

Napríklad pravdepodobne potrebujeme preložiť čas do časového pásma koncového používateľa, takže globálne časové pásmo by nemalo veľký zmysel. Ak globálne časové pásmo nie je potrebné, zvážte zadanie časového pásma priamo v každej inštancii dátumu a času. Buď ZonedDateTime alebo OffsetDateTime je na to šikovná trieda.

5. Záver

V tomto tutoriáli sme vysvetlili niekoľko spôsobov, ako upraviť časové pásmo JVM. Videli sme, že môžeme nastaviť celosystémovú premennú prostredia, zmeniť argument JVM alebo ho programovo upraviť z našej aplikácie.

Ako obvykle sú všetky príklady použité v tomto článku dostupné na GitHub.


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