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

Представяме ви 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 today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

Получаване на дата в определена часова зона

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

За да направим това, имаме нужда от друг клас — ZoneIdкласът (java.time.ZoneId). Има of()метод, който връща ZoneIdобект с името на часовата зона.

За да определите текущата дата в Шанхай, трябва да напишете следния code:

Код Конзолен изход
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

Можете да намерите списък с имената на всички часови зони в интернет.


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 месеците най-накрая спряха да се броят от нула.

Пример:

Код Конзолен изход
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

Получаване на дата по индекса на деня

Има още един интересен начин за създаване на дата: с помощта на ofYearDayметода можете да получите дата само въз основа на числото на годината и индекса на деня в годината. Ето общия вид:

LocalDate date = LocalDate.ofYearDay(year, day);

Къде yearе числото на годината и dayе индексът на деня в годината.

Пример:

Код Конзолен изход
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

100-ият ден на 2019 г. е 10 април.

Получаване на Unix дата

Спомняте ли си, че Dateобектите винаги съхраняват времето като брой мorсекунди от 1 януари 1970 г.? За да се гарантира, че програмистите няма да пропуснат добрите стари времена, LocalDateкласът получи ofEpochDay()метод, който връща датата, изчислена от 1 януари 1970 г. Ето общия вид:

LocalDate date = LocalDate.ofEpochDay(day);

Къде dayе броят на дните, изминали от 1 януари 1970 г.

Пример:

Код Конзолен изход
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. Получаване на елементи от дата

Невъзможно е да промените LocalDateобекти, но можете да получите отделни елементи от съхранената дата. LocalDateобектите имат няколко метода за това:

Метод Описание
int getYear()
Връща годината на конкретна дата
Month getMonth()
Връща месеца на датата: една от няколко константи
JANUARY, FEBRUARY, ...;
int getMonthValue()
Връща индекса на месеца на датата. януари == 1.
int getDayOfMonth()
Връща индекса на деня от месеца
int getDayOfYear()
Връща индекса за деня от началото на годината
DayOfWeek getDayOfWeek()
Връща деня от седмицата: една от няколко константи
MONDAY, TUESDAY, ...;
IsoEra getEra()
Връща ерата: or BCE(Преди текущата ера) or CE(Текуща ера)

Пример:

Код Конзолен изход
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

5. Смяна на дата в LocalDateобект

Класът LocalDateсъдържа няколко метода, които ви позволяват да работите с дати. Реализацията на тези методи е аналогична на методите на Stringкласа: те не променят съществуващия LocalDateобект, а instead of това връщат нов с желаните данни.

Ето методите на LocalDateкласа:

Метод Описание
plusDays(int days)
Добавя определен брой дни към датата
plusWeeks(int weeks)
Добавя седмици към датата
plusMonths(int months)
Добавя месеци към датата
plusYears(int years)
Добавя години към датата
minusDays(int days)
Изважда дни от датата
minusWeeks(int weeks)
Изважда седмици от датата
minusMonths(int months)
Изважда месеци от датата
minusYears(int years)
Изважда годините от датата

Пример:

Код Конзолен изход
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

Чиито birthday objectметоди извикваме не се променя. Вместо това неговите методи връщат нови обекти, които съдържат желаните данни.