Класс LocalTime в Java: текущее время, форматирование и методы - Вопросы

Всего: 6 вопросов

1. 

Что такое LocalTime в Java и чем он отличается от LocalDateTime, ZonedDateTime и Instant?

java.time.LocalTime — неизменяемый потокобезопасный класс из Java 8, который хранит только время суток (часы, минуты, секунды, наносекунды) без даты и часового пояса, например 13:45:30.123456789. Он подходит для расписаний, часов работы и будильников.

LocalDateTime добавляет к времени дату, ZonedDateTime — ещё и часовой пояс, а Instant описывает точный момент на шкале UTC (метки времени, логи). Перейти от LocalTime к LocalDateTime можно методом atDate(LocalDate), обратно — через toLocalTime(); чтобы получить Instant, нужна ещё и зона: time.atDate(date).atZone(zone).toInstant().

2. 

Как получить текущее время в Java через LocalTime и как сделать такой код тестируемым?

LocalTime.now() возвращает время суток по системным часам в часовом поясе JVM по умолчанию, вместе с долями секунды (начиная с Java 9 — как правило микросекунды). Для другой зоны используют LocalTime.now(ZoneId.of("Asia/Tokyo")). Пользователю время обычно показывают отформатированным или усечённым: LocalTime.now().truncatedTo(ChronoUnit.SECONDS).

Для тестов в класс передают Clock и вызывают LocalTime.now(clock): в продакшене — Clock.systemDefaultZone(), в тесте — Clock.fixed(Instant.parse("2024-03-15T10:00:00Z"), ZoneOffset.UTC), и результат всегда равен 10:00.

3. 

Какие константы есть в классе LocalTime и в каких границах лежит время суток?

В LocalTime четыре константы: MIN и MIDNIGHT — начало суток 00:00 (равные по значению, LocalTime.MIN.equals(LocalTime.MIDNIGHT) даёт true), NOON — полдень 12:00, MAX — последняя наносекунда суток 23:59:59.999999999.

Значения «24:00» нет: LocalTime.of(24, 0) выбрасывает DateTimeException. То же видно по числу секунд от полуночи: toSecondOfDay() возвращает от 0 до 86399 (у LocalTime.MAX — 86399, доли секунды отбрасываются), а LocalTime.ofSecondOfDay(86400) выбрасывает DateTimeException. Для верхней границы интервала «до конца дня» берут LocalTime.MAX.

4. 

Как сравнить два LocalTime и проверить, попадает ли время в интервал, в том числе через полночь?

Для порядка используют isBefore() и isAfter() (строго раньше / строго позже), для равенства — equals(), а не ==, который сравнивает ссылки. compareTo() возвращает отрицательное число, 0 или положительное, поэтому LocalTime можно сортировать. Например, LocalTime.of(12, 0).equals(LocalTime.NOON) — true.

Обычный интервал (9:00–18:00): !t.isBefore(from) && t.isBefore(to). Если интервал переходит через полночь (22:00–06:00), начало позже конца, и условие t.isAfter(from) && t.isBefore(to) всегда ложно. Нужно «или»: t.isAfter(from) || t.isBefore(to) — для 02:00 это даёт true.

5. 

Чем отличаются методы with...() и truncatedTo() у LocalTime?

withHour(), withMinute(), withSecond(), withNano() и with(ChronoField, long) заменяют одно поле, остальные оставляя прежними: LocalTime.of(13, 45, 30).withHour(8) даёт 08:45:30. Значение вне диапазона (withHour(25)) вызывает DateTimeException.

truncatedTo(ChronoUnit) обнуляет все поля младше указанной единицы: для 13:45:30.123456789 вызов truncatedTo(ChronoUnit.MINUTES) вернёт 13:45. Это удобно, чтобы сравнивать значения now() «с точностью до минуты». Единицы больше суток (MONTHS, YEARS) дают UnsupportedTemporalTypeException. Оба метода не меняют исходный объект, а возвращают новый.

6. 

Чем LocalTime.now() отличается от System.nanoTime() и что использовать для замера скорости кода?

LocalTime.now() отвечает на вопрос «который час?» — это время суток по системным часам. System.nanoTime() отвечает на вопрос «сколько прошло?»: он возвращает long наносекунд от произвольной точки отсчёта, само число не связано со временем суток и имеет смысл только как разность двух вызовов.

Для замера скорости кода нужен System.nanoTime(): его показания не зависят от перевода системных часов (ручная настройка, синхронизация NTP). Разность двух LocalTime.now() может даже оказаться отрицательной, если часы перевели назад или замер пришёлся на полночь.

Страница 1 из 1