JavaRush /Курси /Java Syntax Zero /Корисні нюанси для роботи з DateTime API

Корисні нюанси для роботи з DateTime API

Java Syntax Zero
Рівень 17 , Лекція 6
Відкрита

1. Клас LocalDateTime

Клас LocalDateTime поєднує в собі можливості класів LocalDate і LocalTime: він зберігає і дату, і час. Його об'єкти теж незмінювані, а його методи також аналогічні методам класів LocalDate і LocalTime.

Отримання поточного моменту: дата й час

Тут усе в межах очікувань: теж використовується метод now(). Приклад:

Код Виведення на екран
LocalDateTime time = LocalDateTime.now();
System.out.println("Зараз = " + time);

Зараз = 2019-02-22T09:49:19.275039200

Під час виведення на екран дата й час розділяються літерою T.

Отримання певного моменту: дата й час

Як можна очікувати, усе аналогічно класам LocalDate і LocalTime — використовується метод of():

… = LocalDateTime.of(рік, місяць, день, години, хвилини, секунди);

Спочатку йдуть параметри, що задають дату, у тих самих форматах, що й у класі LocalDate. Потім ідуть параметри, що задають час, у тих самих форматах, що й у класі LocalTime. Нижче наведено список усіх варіацій методу of():

Методи
of (int year, int month, int day, int hour, int minute)
of (int year, int month, int day, int hour, int minute, int second)
of (int year, int month, int day, int hour, int minute, int second, int nano)
of (int year, Month month, int day, int hour, int minute)
of (int year, Month month, int day, int hour, int minute, int second)
of (int year, Month month, int day, int hour, int minute, int second, int nano)
of (LocalDate date, LocalTime time)

Можна задати дату явно або за допомогою об'єктів LocalDate і LocalTime:

Код
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime current = LocalDateTime.of(date, time);
System.out.println("Зараз = " + current);

LocalDateTime date = LocalDateTime.of(2019, Month.MAY, 15, 12, 15, 00);
System.out.println("Зараз = " + date);
Виведення на екран
Зараз = 2019-02-22T10:05:38.465675100
Зараз = 2019-05-15T12:15

Клас LocalDateTime має методи отримання фрагмента дати та/або часу. Вони абсолютно аналогічні методам класів LocalDate і LocalTime. Дублювати їх тут ми не будемо.



2. Клас Instant

Крім того, розробники Java не забули про вподобання старої школи.

У Date Time API додали клас Instant для роботи з часом, пов'язаним із процесами всередині комп'ютерів. Замість годин, хвилин і секунд, він оперує секундами, мілісекундами й наносекундами.

Цей клас зберігає в собі два поля:

  • кількість секунд, які минули з 1 січня 1970 року
  • кількість наносекунд

Клас створено для розробників? Так. Тому він знову рахує час в Unix-time: від початку 1970 року.

Можна навіть сказати, що клас Instant — це спрощена версія класу Date: залишили тільки те, що потрібно програмістам.

Отримати об'єкт Instant можна так само, як об'єкт LocalTime:

Instant timestamp = Instant.now();

де timestamp — це змінна класу Instant, а Instant.now() — виклик статичного методу now() для класу Instant.

Приклад:

Код Виведення на екран
Instant timestamp = Instant.now();
System.out.println(timestamp);

2019-02-22T08:42:42.234945300Z

Також можна створити новий об'єкт за допомогою різновидів методу of(), якщо передати в нього час, який минув з 1 січня 1970 року:

ofEpochMilli(long milliseconds)
Потрібно передати кількість мілісекунд
ofEpochSecond(long seconds)
Потрібно передати кількість секунд
ofEpochSecond(long seconds, long nanos)
Потрібно передати секунди й наносекунди

Методи об'єктів Instant

Клас Instant має два методи, що повертають його значення:

long getEpochSecond()
Кількість секунд, які минули з 1 січня 1970 року
int getNano()
Наносекунди
long toEpochMilli()
Кількість мілісекунд, які минули з 1 січня 1970 року

А ще є методи, здатні створювати нові об'єкти Instant на основі вже наявного:

Instant plusSeconds(long)
Додає секунди до поточного моменту часу
Instant plusMillis(long)
Додає мілісекунди
Instant plusNanos(long)
Додає наносекунди
Instant minusSeconds(long)
Віднімає секунди
Instant minusMillis(long)
Віднімає мілісекунди
Instant minusNanos(long)
Віднімає наносекунди

Приклади:

Код Виведення на екран
Instant timestamp = Instant.now();
System.out.println(timestamp);

long n = timestamp.toEpochMilli();
Instant time = Instant.ofEpochMilli(n);
System.out.println(time);

2019-02-22T09:01:20.535344Z



2019-02-22T09:01:20.535Z

Коментарі (28)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Aleksey Golovin Рівень 39
1 жовтня 2025
І ще одна цікава приватна константа MAX_SECOND = 31556889864403199L
Aleksey Golovin Рівень 39
1 жовтня 2025
Перша задача цікава. Прийшлось згадувати колекції. Добре що знайшов запис в зошиті for (var pair : map.entrySet()) { .......... }
Jaroslav Рівень 48
16 січня 2025
Мої компліменти автору першої задачі - дуже приємно такі розв'язувати Щось подібне було у задачі на реалізацію ArrayList І вимкніть нарешті кнопкосполучення Ctrl+курсор на сайті. Хто його використовує? А я вже втратив добрий десяток розгорнутих коментарів перемикаючись між темами замість навігації між словами
Кирило Рівень 43
23 серпня 2024
Найшов на першу задачу, да так, що аж трішки вигорів й прийшлося робити 2-дневу перерву)
Андрій Рівень 18
4 травня 2024
Дякую chatgpt і коментаторам. Якби не ви, я б ще пару днів вирішував першу задачу
Illia Pakhuta Рівень 51
19 жовтня 2023
Розпочали давати завдання які ти зрозумієш на наступних лекціях, а то і зовсім на інших ресурсах
oleh ronin Рівень 47
14 листопада 2023
А тепер подумайте, для чого так зробили? І ні, не для того щоб перескочили лекцію прочитали, і повернулись назад..
Abver Рівень 4 Expert
3 лютого 2023
Цікаво, задачу Фільтруємо вихідні хтось зробив сам? Бо я щось там повністю завис(
les_yeux_blancs Рівень 50
30 квітня 2023

    public static boolean isWeekend(LocalDateTime dateTime) {
        var dayOfWeeKOffset = dateTime.getDayOfWeek().getValue();

        return switch (dayOfWeeKOffset) {
            case FRIDAY -> dateTime.getHour() >= 22;
            case SUNDAY -> dateTime.getHour() < 23;
            default -> dayOfWeeKOffset == SATURDAY;
        };
    }
Olexandr Рівень 47
28 січня 2024
лямбди, знайомство з якими буде через кілька лекцій? На Spring чогось немає?
Ва Дим Рівень 28
16 травня 2024
зробив стандартно через if - else
Jaroslav Рівень 48
16 січня 2025

int dayOfWeek = dateTime.getDayOfWeek().getValue();
return dayOfWeek == FRIDAY && dateTime.getHour() >= WEEKEND_START_FRIDAY_CUT_OFF_HOUR ||
        dayOfWeek == SATURDAY || dayOfWeek == SUNDAY && dateTime.getHour() < WEEKEND_END_SUNDAY_CUT_OFF_HOUR;
Aleksey Golovin Рівень 39
1 жовтня 2025
Цікаве і простіше рішення. Я робив порівняння часу.
Abver Рівень 4 Expert
2 лютого 2023
Вирішив першу задачу з першого разу). Рекомендую при розвʼязанні відкрити лекцію HashMap.
Bandiu Band Рівень 25
27 вересня 2022
По "кінець часів" - якщо натиснути на колесо миші коли курсор наведений на клас (маю на увазі Instant), то він відкриється в новому вікні і ви побачите що "під капотом", а там є змінна MAX_SECOND і метод MAX в параметрах якого є і MAX_SECOND і максимальна кількість наносекунд.
FAUST_ua Рівень 29
17 вересня 2022
Такс, а по першій задачі знову всім все зрозуміло ? Промучався 2 дні, гуглив англомовні форуми. По ітогу, не знайшов правильного вирішення. Ну насправді, не віриться що дану задачу 109 людей вирішили самостійно майже з першої спроби (1.16). Нереальна задача на даному етапі я вважаю. ІМХО Пояснень в лекції цій, попередніх, чи додаткових - недостатньо.
Bandiu Band Рівень 25
27 вересня 2022
Такс, у нас є Мар (ключ - значення) де ключ типу LocalDate а значення типу List<LocalTime>. тобто у нас є набір дат як ключів з списком "годин" для кожної дати. Це як листи календаря - листок з датою це ключ, а в ньому є список годин. Від нас хотять щоб ми перевели це в вигляд просто списку, а для цього нам потрібно циклами пройтись по ключам { по значенням List<LocalTime>}, і синтезувати новий Set result.add(LocalDateTime.of(entry.getKey(), time));
4 жовтня 2022
Так. Без знань по колекціям не вирішити.
hnatiukk Рівень 51 Expert
11 грудня 2022
мені вдалось вирішити її з першої спроби (але повертався до рівня з колекціями, щоб нагадати як отримати всі значення відповідного ключа)
Ivan Lebid' Рівень 108 Expert
6 травня 2023
дякую хоч зрозумів саме завдання(вдалося вирішити з першого разу, що права +- півтори - 2 години довелось витратити)
Andriy Рівень 26
25 червня 2023
Мені вдалось з першої спроби з допомогою пояснень від chatGPT (аналог повернення до лекції про HashMap, але набагато швидше): 1. По умові було зрозуміло, що потрібно сконвертувати map в hash set 2. Спочатку спитав приклад, як сконвертувати map в hash set > зрозумів, як отримати ключі date 3. Спочатку спитав приклад, як пройтись по значеннях ключа > зрозумів, як перебрати значення time 4. Далі вже реалізував все для задачі, подебажив, підправив і отримав робочий код, який прийняв валідатор п.с. після порівняння з розв'язком мій варіант не такий елегантний, але ж працює )
Pavlo Kezin Рівень 23
26 вересня 2023
мені доречі дуже сподобалася ця задача. Справжній середній рівень. З пам'яті не вирішив , але було зрозуміло, що і де потрібно шукати.