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