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:
Код | Конзолен изход (частично) |
---|---|
|
|
За да получите ZoneId
обект по името му, трябва да използвате статичния of()
метод;
Код | Забележка |
---|---|
|
|
2. Създаване на ZonedDateTime
обект
Когато създавате ZonedDateTime
обект, трябва да извикате статичния now()
метод на класа и да ZoneId
му предадете обект.
Код | Конзолен изход |
---|---|
|
|
Ако не подадете ZoneId
обект към now()
метода (и това е позволено), тогава часовата зона се определя автоматично въз основа на настройките на компютъра, който изпълнява програмата.
Пример:
Код | Конзолен изход |
---|---|
|
|
Преобразуване на глобална дата в местна
Една от интересните характеристики на 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
класът има много начини да получи отделни елементи от дата и час. Ето списък на тези методи:
|
Връща годината на конкретна дата |
|
Връща месеца на датата: една от няколко константи —JANUARY, FEBRUARY, ...; |
|
Връща индекса на месеца на датата. януари == 1 |
|
Връща индекса на деня от месеца |
|
Връща деня от седмицата: една от няколко константи —MONDAY, TUESDAY, ...; |
|
Връща индекса на деня от годината |
|
Връща часовете |
|
Връща minutesите |
|
Връща секундите |
|
Връща наносекунди |
Всички методи са напълно аналогични на методите на LocalDateTime
класа. И, разбира се, ZonedDateTime
класът има методи, които ви позволяват да работите с дати и часове. Въпреки това обектът, на който се извикват методите, не се променя. Вместо това те връщат нов ZonedDateTime
обект:
Методи | Описание |
---|---|
|
Добавя години към датата |
|
Добавя месеци към датата |
|
Добавя дни към датата |
|
Добавя часове |
|
Добавя minutesи |
|
Добавя секунди |
|
Добавя наносекунди |
|
Изважда годините от датата |
|
Изважда месеци от датата |
|
Изважда дни от датата |
|
Изважда часове |
|
Изважда minutesи |
|
Изважда секунди |
|
Изважда наносекунди |
Няма да даваме примери, тъй като смятаме, че всичко тук е ясно по аналогия с класовете, които току-що разгледахме.