Как да настроите часовата зона на JVM

1. Общ преглед

Потребителите на нашите приложения могат да бъдат взискателни, когато става въпрос за времеви марки. Те очакват нашите приложения автоматично да откриват своите часови зони и да показват времеви клейма в правилната часова зона.

В този урок ще разгледаме няколко начина, по които можем да модифицираме часовата зона на JVM . Ще научим и за някои клопки, свързани с управлението на часовата зона.

2. Въведение в часовата зона

По подразбиране JVM чете информация за часовата зона от операционната система. Тази информация се предава на класа TimeZone , който съхранява часовата зона и изчислява лятното часово време .

Можем да извикаме метода getDefault, който ще върне часовата зона, в която се изпълнява програмата. Освен това можем да получим списък с поддържани идентификатори на часови зони от приложението, използвайки TimeZone.getAvailableIDs () .

Когато именува часовата зона, Java разчита на конвенцията за именуване на базата данни tz .

3. Промяна на часовия пояс

В този раздел ще разгледаме няколко начина, по които можем да променим часовата зона в JVM.

3.1. Задаване на променлива на околната среда

Нека започнем, като видим как можем да използваме променлива на околната среда, за да променим часовата зона. Можем да добавяме или модифицираме променлива на околната среда TZ.

Например в среда, базирана на Linux, можем да използваме командата за експортиране :

export TZ="America/Sao_Paulo"

След като зададем променливата на средата, можем да видим, че часовата зона на нашето работещо приложение вече е America / Sao_Paulo:

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

3.2. Задаване на JVM аргумент

Алтернатива на задаването на променлива на средата е задаването на JVM аргумент user.timezone . Този аргумент на JVM има предимство пред променливата на околната среда TZ .

Например, можем да използваме флага -D, когато стартираме нашето приложение:

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

По същия начин можем да зададем аргумента JVM от приложението :

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

Сега можем да видим, че часовата зона е Азия / Калкута:

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

3.3. Задаване на часовата зона от приложението

И накрая, можем също да модифицираме часовата зона на JVM от приложението, като използваме класа TimeZone . Този подход има предимство както над променливата на средата, така и над аргумента JVM.

Задаването на часовата зона по подразбиране е лесно:

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

Както се очаква, часовата зона вече е Португалия :

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

4. Капани

4.1. Използване на трибуквени идентификатори на часовата зона

Въпреки че е възможно да се използват трибуквени идентификатори за представяне на часовата зона, не се препоръчва.

Вместо това трябва да използваме по-дългите имена, тъй като трибуквените идентификатори са двусмислени. Например IST може да бъде или стандартно време за Индия, ирландско стандартно време или стандартно време за Израел.

4.2. Глобални настройки

Имайте предвид, че всеки от горните подходи определя глобалната часова зона за цялото приложение. В съвременните приложения обаче настройването на часовата зона често е по-нюансирано от това.

Например вероятно трябва да преведем времето в часовата зона на крайния потребител и така глобалната часова зона няма да има много смисъл. Ако не е необходима глобална часова зона, помислете дали да посочите часовата зона директно във всеки екземпляр дата-час. Или ZonedDateTime или OffsetDateTime е удобен клас за това.

5. Заключение

В този урок обяснихме няколко начина за модифициране на часовата зона на JVM. Видяхме, че можем или да зададем общосистемна променлива на средата, да променим JVM аргумент или да го модифицираме програмно от нашето приложение.

Както обикновено, всички примери, използвани в тази статия, са достъпни в GitHub.