1. ZonedDateTimeклас

Има още един много интересен клас в API за дата и час: класът ZonedDateTime. Основната му цел е да улесни работата с дати в различни часови зони.

LocalDateе чудесен за представяне на дати. Например рождени дни. Моят рожден ден е 15 март, независимо къде съм. Това е пример за дата.

LocalTimeе чудесен за описване на времето, като времето, зададено на будилник: настройвам алармата за 5:00 сутринта и няма meaning къде съм. 5:00 сутринта си е 5:00 сутринта. Това е пример за работа с времето.

Сега да кажем, че пишем приложение, което резервира полети. Самолетите излитат и пристигат според местното време. Самолетът е във въздуха за определено време, но часовите зони могат да се променят.

Времеви зони

Между другото, часовите зони са истинска бъркотия. И ако си мислите, че има 24 часови зони, много се лъжете.

Например времето в Индия се различава от средното време по Гринуич с пет часа и половина: GMT+5:30. Някои държави преминават към лятно часово време, а други не. Нещо повече, различните страни преминават към лятно часово време по различно време на годината.

И някои държави приемат закони, които отменят лятното часово време, or го въвеждат отново, or го отменят отново.

Във всеки случай светът има часови зони и във всяка часова зона има едно време. Времето в различни зони може да съвпада през определени периоди от годината и след това да се различава през други периоди. Часовите зони обикновено се кръщават на големите градове, разположени в тях: Europe/Monaco, Asia/Singapore, но има и изключения — US/Pacific.

Официално в момента има 599 часови зони. Помислете за това: 599. Това е далеч от 24. Добре дошли в глобалния свят.

Класът ZoneIdот java.timeпакета се използва за съхраняване на часова зона в Java.

Между другото, има статичен getAvailableZoneIds()метод, който връща набора от всички известни в момента часови зони. За да получите списък с всички зони, трябва да напишете следния code:

Код Конзолен изход (частично)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

За да получите ZoneIdобект по името му, трябва да използвате статичния of()метод;

Код Забележка
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. Създаване на ZonedDateTimeобект

Когато създавате ZonedDateTimeобект, трябва да извикате статичния now()метод на класа и да ZoneIdму предадете обект.

Код Конзолен изход
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime time = ZonedDateTime.now(zone);
System.out.println(time);


2019-02-22T11:37:58.074816+02:00[Africa/Cairo]

Ако не подадете ZoneIdобект към now()метода (и това е позволено), тогава часовата зона се определя автоматично въз основа на настройките на компютъра, който изпълнява програмата.

Пример:

Код Конзолен изход
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

2019-02-22T13:39:05.70842+02:00[Europe/Helsinki]

Преобразуване на глобална дата в местна

Една от интересните характеристики на ZonedDateTimeе способността му да преобразува в местна дата и час. Пример:

ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);

LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();

3. Работа с времето

Подобно на LocalDateTimeкласа, ZonedDateTimeкласът има много начини да получи отделни елементи от дата и час. Ето списък на тези методи:

int getYear()
Връща годината на конкретна дата
Month getMonth()
Връща месеца на датата: една от няколко константи —JANUARY, FEBRUARY, ...;
int getMonthValue()
Връща индекса на месеца на датата. януари == 1
int getDayOfMonth()
Връща индекса на деня от месеца
DayOfWeek getDayOfWeek()
Връща деня от седмицата: една от няколко константи —MONDAY, TUESDAY, ...;
int getDayOfYear()
Връща индекса на деня от годината
int getHour()
Връща часовете
int getMinute()
Връща minutesите
int getSecond()
Връща секундите
int getNano()
Връща наносекунди

Всички методи са напълно аналогични на методите на LocalDateTimeкласа. И, разбира се, ZonedDateTimeкласът има методи, които ви позволяват да работите с дати и часове. Въпреки това обектът, на който се извикват методите, не се променя. Вместо това те връщат нов ZonedDateTimeобект:

Методи Описание
plusYears(int)
Добавя години към датата
plusMonths(int)
Добавя месеци към датата
plusDays(int)
Добавя дни към датата
plusHours(int)
Добавя часове
plusMinutes(int)
Добавя minutesи
plusSeconds(int)
Добавя секунди
plusNanos(int)
Добавя наносекунди
minusYears(int)
Изважда годините от датата
minusMonths(int)
Изважда месеци от датата
minusDays(int)
Изважда дни от датата
minusHours(int)
Изважда часове
minusMinutes(int)
Изважда minutesи
minusSeconds(int)
Изважда секунди
minusNanos(int)
Изважда наносекунди

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