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

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

Відкрита

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. Дублювати їх тут ми не будемо.


17
Задача
Java Syntax Zero,  17 рівень,  6 лекція
Недоступна
Синтезуємо LocalDateTime
Синтезуємо LocalDateTime
17
Задача
Java Syntax Zero,  17 рівень,  6 лекція
Недоступна
Фільтруємо вихідні
Фільтруємо вихідні

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

17
Задача
Java Syntax Zero,  17 рівень,  6 лекція
Недоступна
Кінець часів
Кінець часів
17
Задача
Java Syntax Zero,  17 рівень,  6 лекція
Недоступна
Ой, як багато методів!
Ой, як багато методів!
Коментарі (28)
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Aleksey Golovin
Рівень 1
1 жовтня 2025, 18:38
І ще одна цікава приватна константа MAX_SECOND = 31556889864403199L
Aleksey Golovin
Рівень 1
1 жовтня 2025, 17:05
Перша задача цікава. Прийшлось згадувати колекції. Добре що знайшов запис в зошиті for (var pair : map.entrySet()) { .......... }
Jaroslav
Рівень 48
16 січня 2025, 21:04
Мої компліменти автору першої задачі - дуже приємно такі розв'язувати Щось подібне було у задачі на реалізацію ArrayList І вимкніть нарешті кнопкосполучення Ctrl+курсор на сайті. Хто його використовує? А я вже втратив добрий десяток розгорнутих коментарів перемикаючись між темами замість навігації між словами
Кирило
Рівень 43
23 серпня 2024, 12:57
Найшов на першу задачу, да так, що аж трішки вигорів й прийшлося робити 2-дневу перерву)
Андрій
Рівень 18
4 травня 2024, 17:52
Дякую chatgpt і коментаторам. Якби не ви, я б ще пару днів вирішував першу задачу
Illia Pakhuta QA Automation Engineer в Netflix
19 жовтня 2023, 09:30
Розпочали давати завдання які ти зрозумієш на наступних лекціях, а то і зовсім на інших ресурсах
oleh ronin
Рівень 47
14 листопада 2023, 09:23
А тепер подумайте, для чого так зробили? І ні, не для того щоб перескочили лекцію прочитали, і повернулись назад..
Abver
Рівень 4
Expert
3 лютого 2023, 17:26
Цікаво, задачу Фільтруємо вихідні хтось зробив сам? Бо я щось там повністю завис(
les_yeux_blancs QA Automation Engineer
30 квітня 2023, 17:49
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
Рівень 16
28 січня 2024, 18:23
лямбди, знайомство з якими буде через кілька лекцій? На Spring чогось немає?
hidden #3421731
Рівень 28
16 травня 2024, 16:37
зробив стандартно через if - else
Jaroslav
Рівень 48
16 січня 2025, 21:18
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
Рівень 1
1 жовтня 2025, 17:25
Цікаве і простіше рішення. Я робив порівняння часу.
Abver
Рівень 4
Expert
2 лютого 2023, 22:52
Вирішив першу задачу з першого разу). Рекомендую при розвʼязанні відкрити лекцію HashMap.
Bandiu Band
Рівень 25
27 вересня 2022, 20:31
По "кінець часів" - якщо натиснути на колесо миші коли курсор наведений на клас (маю на увазі Instant), то він відкриється в новому вікні і ви побачите що "під капотом", а там є змінна MAX_SECOND і метод MAX в параметрах якого є і MAX_SECOND і максимальна кількість наносекунд.
FAUST_ua
Рівень 29
17 вересня 2022, 08:15
Такс, а по першій задачі знову всім все зрозуміло ? Промучався 2 дні, гуглив англомовні форуми. По ітогу, не знайшов правильного вирішення. Ну насправді, не віриться що дану задачу 109 людей вирішили самостійно майже з першої спроби (1.16). Нереальна задача на даному етапі я вважаю. ІМХО Пояснень в лекції цій, попередніх, чи додаткових - недостатньо.
Bandiu Band
Рівень 25
27 вересня 2022, 20:08
Такс, у нас є Мар (ключ - значення) де ключ типу LocalDate а значення типу List<LocalTime>. тобто у нас є набір дат як ключів з списком "годин" для кожної дати. Це як листи календаря - листок з датою це ключ, а в ньому є список годин. Від нас хотять щоб ми перевели це в вигляд просто списку, а для цього нам потрібно циклами пройтись по ключам { по значенням List<LocalTime>}, і синтезувати новий Set result.add(LocalDateTime.of(entry.getKey(), time));
4 жовтня 2022, 12:46
Так. Без знань по колекціям не вирішити.
hnatiukk
Рівень 51
Expert
11 грудня 2022, 18:38
мені вдалось вирішити її з першої спроби (але повертався до рівня з колекціями, щоб нагадати як отримати всі значення відповідного ключа)
Ivan Lebid'
Рівень 108
Expert
6 травня 2023, 22:32
дякую хоч зрозумів саме завдання(вдалося вирішити з першого разу, що права +- півтори - 2 години довелось витратити)
Andriy
Рівень 26
25 червня 2023, 10:41
Мені вдалось з першої спроби з допомогою пояснень від chatGPT (аналог повернення до лекції про HashMap, але набагато швидше): 1. По умові було зрозуміло, що потрібно сконвертувати map в hash set 2. Спочатку спитав приклад, як сконвертувати map в hash set > зрозумів, як отримати ключі date 3. Спочатку спитав приклад, як пройтись по значеннях ключа > зрозумів, як перебрати значення time 4. Далі вже реалізував все для задачі, подебажив, підправив і отримав робочий код, який прийняв валідатор п.с. після порівняння з розв'язком мій варіант не такий елегантний, але ж працює )
Pavlo Kezin
Рівень 23
26 вересня 2023, 13:49
мені доречі дуже сподобалася ця задача. Справжній середній рівень. З пам'яті не вирішив , але було зрозуміло, що і де потрібно шукати.