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

Комментарии (242)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Maxim Terletsky Уровень 24
27 июля 2026
Long.MAX_VALUE - максимальное значение типа long (9,223,372,036,854,775,807 мс) Instant.MAX.getEpochSecond() - максимальное количество секунд в Instant (315,568,898,644,031,99 сек) Instant.MAX.getNano() - максимальное количество наносекунд в Instant (999,999,999 нс) Лучше запиши в свой конспект. Можешь не благодарить 😉
Maxim Terletsky Уровень 24
27 июля 2026
P.S. Посмотри еще как работает ChronoUnit: перечисление (enum) из пакета java.time.temporal, включающее в себя единицы измерения времени (дни, часы, секунды, годы и т. д.)

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class ChronoUnitExample {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        System.out.println("Сейчас: " + now);

        LocalDateTime minusTime = now
                .minus(2, ChronoUnit.HOURS)
                .minus(30, ChronoUnit.MINUTES);
        System.out.println("2 часа 30 минут назад: " + minusTime);

        LocalDateTime plusDays = now.plus(3, ChronoUnit.DAYS);
        System.out.println("Через 3 дня: " + plusDays);

        LocalDateTime future = LocalDateTime.of(2100, 12, 31, 23, 59);
        long daysBetween = ChronoUnit.DAYS.between(now, future);
        System.out.println("До Нового года в 2100 году осталось: " + daysBetween + " дней");
    }
}
Методы, работающие с ChronoUnit и LocalDateTime: 1. plus(amount, ChronoUnit) - добавление времени 2. minus(amount, ChronoUnit) - вычитание времени 3. ChronoUnit.unit.between(t1, t2) - получение разницы между датами Доступные единицы ChronoUnit: • NANOS - наносекунды • MICROS - микросекунды • MILLIS - миллисекунды • SECONDS - секунды • MINUTES - минуты • HOURS - часы • HALF_DAYS - половина дня (12 часов) • DAYS - дни • WEEKS - недели • MONTHS - месяцы • YEARS - годы • DECADES - десятилетия • CENTURIES - века • MILLENNIA - тысячелетия Остальное либо гуглишь, либо смотришь из других комментариев.
Grigoryvvv Уровень 26 Expert
12 июля 2026
12.07.2026 / 17 уровень ● LocalDateTime — абстракция локальной даты и времени: 2026-07-12T12:00:00 Но где это? Москва? Токио? Нью-Йорк? Какой часовой пояс? Неизвестно. ● Instant — абстракция момента времени на мировой шкале времени (UTC): 2026-07-12T12:00:00Z Это уже точка на единой мировой временной шкале. Буква Z (zero offset = нулевое смещение относительно UTC) в конце означает, что шкала времени Instant определена относительно UTC+00:00 (нулевой меридиан). Нулевой меридиан проходит через Гринвич (район Лондона). Почему за условную точку Нулевого меридиана (UTC+00:00) выбрали не Париж, Рим или другую точку Земного шара? В XIX веке Великобритания была ведущей морской державой, а Королевская обсерватория в Гринвиче имела большое влияние в астрономии и навигации. Многие морские карты уже использовали Гринвич как начало отсчёта. Общее международное принятие произошло в 1884 году на Вашингтонской международной меридианной конференции. 2026-07-12T12:00:00Z - говорит нам, что событие произошло 12 июля 2026 и на часах в Гринвиче (UTC+00:00) в это мгновение был полдень (12:00). Привязка к Мировому времени. ● ZonedDateTime - абстракция календарной даты и времени, привязанные к конкретному часовому поясу. Казалось, можно просто прибавлять к нулевому меридиану (UTC+00:00) временное смещение и получать локальное время привязанное к мировому. Но! В то время считали, что если летом вставать раньше и использовать дневной свет максимально эффективно, то можно уменьшить расход электроэнергии, угля. Впервые переход на летнее время ввела Германская империя 30 апреля 1916 года, во время Первой мировой войны. Нью-Йорк до сих пор переводит часы на летнее время. Смещение зимой UTC−05:00, летом UTC−04:00. Поэтому недостаточно хранить только смещение (UTC−05:00). Необходимо хранить сам часовой пояс (America/New_York), который содержит правила изменения смещения для разных дат. Именно для этого и существует ZonedDateTime.
Grigoryvvv Уровень 26 Expert
13 июля 2026
ZoneId — идентификатор часового пояса, например America/New_York, Europe/London или Asia/Tokyo. Java поддерживает около 600 таких идентификаторов. ZonedDateTime — содержит календарную дату и время, ZoneId и соответствующее этой дате смещение относительно UTC (ZoneOffset). Смещение определяется по правилам выбранного часового пояса, включая переходы на летнее и зимнее время. При создании ZonedDateTime мы передаем ZoneId, чтобы Java могла поставить, какое смещение относительно UTC, с учетом переходов на летнее и зимнее время, действует для указанной даты.
Rei Уровень 32
5 февраля 2026
Выдержка из ИИ: Это классическая ситуация в заданиях, когда проверка не совпадает с теорией: платформа просто хочет одно конкретное число, а не “идеальное значение по стандарту Java”. Почему Instant.ofEpochMilli(Long.MAX_VALUE) проходит Метод ofEpochMilli(long) принимает любое значение long, пока оно в пределах допустимых чисел. Long.MAX_VALUE = 9 223 372 036 854 775 807 → тест считает это “максимум” для миллисекунд. С точки зрения платформы это “правильный ответ”. ⚠️ Важно: это не настоящий максимальный Instant, который может хранить Java. Реально Instant.MAX ≈ 31556889864403199 секунд + 999_999_999 наносекунд. Но тест просто игнорирует физические пределы Instant и проверяет число, которое они заложили в проверку. И для инфы может кому полезно будет: Java Instant умеет работать с Duration, который специально создан для работы с периодами времени. Подписка ИИ себя оправдывает явно куда больше, нежели подписка джавараш.
Кирилл Уровень 101
28 ноября 2025
бомба, ракета, петарда. Где, когда и куда мы это будем пихать не ясно. Задачи низкий поклон, потыкали, посмотрели решение, забыли
No Mercy Уровень 19
21 сентября 2025
Задачи с return на этом уровне просто топ
Anonymous #3585174 Уровень 33
19 июля 2025
Like
Сергей Уровень 32
14 июля 2025
видимо какое у класса ограничение в наносекундах и в секундах это мы должны сами догадаться.
4el0vek3 Уровень 40
20 июля 2025

Instant.MAX.getEpochSecond();
В классе Instant есть константы максимальных значений
LisoEdoEd Уровень 6 Student
6 сентября 2025
Конечно, нужно уметь искать информацию. Как ты до сих пор этого не понял
hjh Уровень 1
3 января 2026
Лично мне такой подход не нравится. Конечно искать информацию это полезный навык, но зачем тогда создавалось это приложение, если после каждой лекции мы должны лезть в документацию? не проще ли работать только с документацией
FreemanG0 Уровень 1
27 января 2026
Приложение сделано для того что бы ты не изучал все темы подряд и не путался, обычно подобного рода приложения показывают тебе путь от точки А к точке Б по определённому маршруту. А в одиночку только чисто по документации ты ничего не разберешь и запутаешься. Как пример ты хочешь изучить Джаву открываешь первую документацию и тебе сразу Глава про потоки, вот и думай. Это как школа или универ тебе в первом классе не учат дискриминанту или основе термодинамики потому что ты еще не знаешь базу.
hjh Уровень 1
3 февраля 2026
так с интернета можно скачать roadmap и по ней темы и проходить
Алла Уровень 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 Уровень 33
24 июня 2025
я начал читать оф.документацию, яндекс.
Vladimir Уровень 24
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