1. Представяне на API за дата и час

Създателите на Java не харесаха ситуацията с класовете Date и Calendar. Те бяха добри в деня си, но времената се променят. И стана необходимо нещо просто, мощно и надеждно. И с пускането на Java 8 (15 години след Calendarпоявата му), Java Date Time API беше въведен. Това е набор от класове, които трябва да могат да решават всяка възможна задача, свързана с времето.
Имаше толкова много класове, че бяха разделени на няколко пакета:
Пакетът java.timeе основният пакет за Java Date Time API: той съдържа класове като LocalDate, LocalTime, LocalDateTime, Instant, Periodи Duration. Всички обекти от тези класове са immutable, което означава, че не могат да бъдат променяни след създаването.
Пакетът java.time.formatсъдържа класове за форматиране на времето, т.е. конвертиране на времена (и дати) в низове и обратно. Например, той съдържа универсалния DateTimeFormatterклас, който замества SimpleDateFormatкласа.
Пакетът java.time.zoneсъдържа класове за работа с часови зони. Той съдържа класове като TimeZoneи ZonedDateTime. Ако пишете сървърен code за клиенти, разположени в различни части на света, наистина ще имате нужда от тези класове.
2. LocalDateклас
Първият и най-полезен клас от API за дата и час, който ще разгледаме, е класът LocalDate. Както вероятно се досещате от името му, този клас е предназначен за работа с дати.
Обектите от този клас не се променят след като са създадени, т.е. класът LocalDateе неизменен. Но това свойство добавя простота и надеждност към класа. Особено ако няколко нишки (нишки на изпълнение) взаимодействат с такъв обект едновременно.
За да създадете нов LocalDateобект, трябва да използвате един от статичните методи. Ето списък на основните.
Получаване на текущата дата
За да получите текущата дата, трябва да използвате статичен now()метод. Това е много по-лесно, отколкото изглежда:
LocalDate today = LocalDate.now();
Където todayе LocalDateпроменлива и LocalDate.now()е извикване на статичния now()метод на LocalDateкласа.
Пример:
| Код | Конзолен изход |
|---|---|
|
|
Получаване на дата в определена часова зона
Класът LocalDateима и вариант на now(ZoneId)метода, който ви позволява да получите текущата дата в определена часова зона.
За да направим това, имаме нужда от друг клас — ZoneIdкласът (java.time.ZoneId). Има of()метод, който връща ZoneIdобект с името на часовата зона.
За да определите текущата дата в Шанхай, трябва да напишете следния code:
| Код | Конзолен изход |
|---|---|
|
|
Можете да намерите списък с имената на всички часови зони в интернет.
3. Получаване на конкретна дата
За да получите LocalDateобект, който представлява конкретна дата, трябва да използвате статичния of()метод. Всичко тук също е много просто и ясно:
LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);
Където dateе LocalDateпроменлива и е извикване на статичния метод на класа.LocalDate.of()of()LocalDate
Тук виждаме, че FEBRUARYконстантата на Monthкласа (java.time.Month) се използва за определяне на февруари като месец.
Можете също така да посочите месеца по старомодния начин - като използвате число:
LocalDate date = LocalDate.of(2019, 2, 22);
две? Вместо февруари? Това означава ли, че месеците отново се броят от едно?
Да, почти 20 години след създаването на Java месеците най-накрая спряха да се броят от нула.
Пример:
| Код | Конзолен изход |
|---|---|
|
|
Получаване на дата по индекса на деня
Има още един интересен начин за създаване на дата: с помощта на ofYearDayметода можете да получите дата само въз основа на числото на годината и индекса на деня в годината. Ето общия вид:
LocalDate date = LocalDate.ofYearDay(year, day);
Къде yearе числото на годината и dayе индексът на деня в годината.
Пример:
| Код | Конзолен изход |
|---|---|
|
|
100-ият ден на 2019 г. е 10 април.
Получаване на Unix дата
Спомняте ли си, че Dateобектите винаги съхраняват времето като брой мorсекунди от 1 януари 1970 г.? За да се гарантира, че програмистите няма да пропуснат добрите стари времена, LocalDateкласът получи ofEpochDay()метод, който връща датата, изчислена от 1 януари 1970 г. Ето общия вид:
LocalDate date = LocalDate.ofEpochDay(day);
Къде dayе броят на дните, изминали от 1 януари 1970 г.
Пример:
| Код | Конзолен изход |
|---|---|
|
|
4. Получаване на елементи от дата
Невъзможно е да промените LocalDateобекти, но можете да получите отделни елементи от съхранената дата. LocalDateобектите имат няколко метода за това:
| Метод | Описание |
|---|---|
|
Връща годината на конкретна дата |
|
Връща месеца на датата: една от няколко константиJANUARY, FEBRUARY, ...; |
|
Връща индекса на месеца на датата. януари == 1. |
|
Връща индекса на деня от месеца |
|
Връща индекса за деня от началото на годината |
|
Връща деня от седмицата: една от няколко константиMONDAY, TUESDAY, ...; |
|
Връща ерата: or BCE(Преди текущата ера) or CE(Текуща ера) |
Пример:
| Код | Конзолен изход |
|---|---|
|
|
5. Смяна на дата в LocalDateобект
Класът LocalDateсъдържа няколко метода, които ви позволяват да работите с дати. Реализацията на тези методи е аналогична на методите на Stringкласа: те не променят съществуващия LocalDateобект, а instead of това връщат нов с желаните данни.
Ето методите на LocalDateкласа:
| Метод | Описание |
|---|---|
|
Добавя определен брой дни към датата |
|
Добавя седмици към датата |
|
Добавя месеци към датата |
|
Добавя години към датата |
|
Изважда дни от датата |
|
Изважда седмици от датата |
|
Изважда месеци от датата |
|
Изважда годините от датата |
Пример:
| Код | Конзолен изход |
|---|---|
|
|
Чиито birthday objectметоди извикваме не се променя. Вместо това неговите методи връщат нови обекти, които съдържат желаните данни.
GO TO FULL VERSION