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и |
|
Изважда секунди |
|
Изважда наносекунди |
Няма да даваме примери, тъй като смятаме, че всичко тук е ясно по аналогия с класовете, които току-що разгледахме.
GO TO FULL VERSION