JavaRush /Курсы /Java Syntax Pro /Полезные нюансы при работе с DateTime API

Полезные нюансы при работе с DateTime API

Java Syntax Pro
16 уровень , 5 лекция
Открыта

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

Комментарии (235)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Кирилл Уровень 36
28 ноября 2025
бомба, ракета, петарда. Где, когда и куда мы это будем пихать не ясно. Задачи низкий поклон, потыкали, посмотрели решение, забыли
No Mercy Уровень 19
21 сентября 2025
Задачи с return на этом уровне просто топ
Anonymous #3585174 Уровень 33
19 июля 2025
Like
Сергей Уровень 32
14 июля 2025
видимо какое у класса ограничение в наносекундах и в секундах это мы должны сами догадаться.
4el0vek3 Уровень 36
20 июля 2025

Instant.MAX.getEpochSecond();
В классе Instant есть константы максимальных значений
LisoEdoEd Уровень 20 Student
6 сентября 2025
Конечно, нужно уметь искать информацию. Как ты до сих пор этого не понял
hjh Уровень 18
3 января 2026
Лично мне такой подход не нравится. Конечно искать информацию это полезный навык, но зачем тогда создавалось это приложение, если после каждой лекции мы должны лезть в документацию? не проще ли работать только с документацией
Алла Уровень 72
4 марта 2025
Огромное спасибо за интересную и обширную лекцию. Отдельная благодарность лектору!!!
AndreyRjr Уровень 25
4 марта 2025
Почему в лекции ни слова про "ChronoUnit." Как я должен про это узнать не заходя в решение?😤 Валидацию прошел, и пошел бы дальше, а то что донести до тебя хотели и не узнал бы... макиально странно!
AndreyRjr Уровень 25
4 марта 2025
https://labex.io/ru/tutorials/java-how-to-use-chronounit-for-date-operations-in-java-414155
Anton Уровень 27
24 июня 2025
я начал читать оф.документацию, яндекс.
Vladimir Уровень 3
25 февраля 2025
Странно, что в параметрах методов указан тип long, но если передать Long.MAX_VALUE, то возникает Instant exceeds minimum or maximum instant Значение Long.MAX_VALUE можно подставлять только для милисекунд Long.MAX_VALUE = 9223372036854775807 +292278994-08-17T07:12:55.807Z Instant.MAX.getEpochSecond() = 31556889864403199 +1000000000-12-31T23:59:59Z Instant.MAX.getEpochSecond() = 31556889864403199 Instant.MAX.getNano() = 999999999 +1000000000-12-31T23:59:59.999999999Z
Anonymous #3545788 Уровень 27
22 февраля 2025

    static public Instant plusMinutes(Instant instant, long minutes) {
        //return Instant.ofEpochSecond(instant.getEpochSecond()+minutes*60);
        return instant.plus(minutes, ChronoUnit.MINUTES);
    }
То что под комментарием работает также как и следующая строка, но валидатор не пропускает...
Артемий Уровень 23
20 февраля 2025
Последнюю задачку решил с помощью класса для конвертации разных типов времени java.util.concurrent.TimeUnit

return instant.plusMillis(TimeUnit.MINUTES.toMillis(minutes));
марк Уровень 25
20 февраля 2025
Синтезируем LocalDateTime задачка интересная мне понравилась, как-то так решил

static Set<LocalDateTime> convert(Map<LocalDate, List<LocalTime>> sourceMap) {
    //напишите тут ваш код
    Set<LocalDateTime> set = new HashSet<>();
    for(Map.Entry<LocalDate, List<LocalTime>> entries: sourceMap.entrySet()) {
        LocalDate keyDate = entries.getKey();
        List<LocalTime> valueTime = entries.getValue();
        for (int i = 0; i < valueTime.size(); i++) {
            set.add(LocalDateTime.of(keyDate, valueTime.get(i)));
        }
    }
    return set;
}