ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Конвертация LocalDateTime в UTC с учётом сезонного времени

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Java
Скопировать код
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime utcDateTime = localDateTime
    .atZone(ZoneId.systemDefault())
    .withZoneSameInstant(ZoneOffset.UTC)
    .toLocalDateTime();

Чтобы преобразовать ваш объект LocalDateTime в UTC, привяжите его к системной временной зоне, затем примените смещение UTC и преобразуйте обратно. Это простой и эффективный метод.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Проблемы перевода на летнее время

Переход на летнее время может стать источником путаницы, не уступающей сложности сборки мебели без инструкции. Однако класс ZonedDateTime с этим справляется. Если вам нужно учесть переход на летнее время, используйте метод withZoneSameInstant. Таким образом, время в LocalDateTime сохранит свою точность при конвертации в UTC.

Настройка времени на UTC

Если вы постоянно работаете с UTC, забудьте о других временных зонах. В этом случае рекомендуется использовать класс Clock:

Java
Скопировать код
Clock utcClock = Clock.systemUTC();
LocalDateTime utcNow = LocalDateTime.now(utcClock);

Метод Clock.systemUTC() позволяет получить доступ к текущему времени в UTC независимо от вашего местоположения.

Вспомогательный класс: упрощение преобразования

Если вам часто приходится преобразовывать время в UTC, рассмотрите возможность создания вспомогательного класса:

Java
Скопировать код
public class DateTimeUtils {

    public static LocalDateTime toUtc(LocalDateTime localDateTime) {
        return localDateTime
            .atZone(ZoneId.systemDefault())
            .withZoneSameInstant(ZoneOffset.UTC)
            .toLocalDateTime();
    }
    // Можно добавлять другие методы работы со временем...
}

Такой класс облегчит работу, объединив все необходимые методы в одном месте.

Визуализация

Предположим, что вы преобразуете LocalDateTime в UTC:

Локальное время: 15:00 (Europe/Berlin)
UTC:              13:00 (UTC)

Изменение часовых поясов выглядит так:

🕒➡️🛫------✈️------🛬➡️🌍

Процесс адаптации времени к UTC:

До: 🕒 15:00 (Berlin)
После: 🌍 13:00 (UTC)

Это аналогично тому, как вы бы настроили часы на часовой пояс UTC.

Точность преобразований: внимание к деталям

Мельчайшие детали имеют важное значение при работе со временем. Это относится к правилам временных зон и проверке данных. Рекомендуется тщательно тестировать граничные случаи, включая переходы на летнее время и изменения определений часовых поясов.

Java
Скопировать код
@Test
public void testConversionToUTC() {
    LocalDateTime beforeDST = LocalDateTime.of(2023, 3, 26, 1, 30);
    LocalDateTime afterDST = DateTimeUtils.toUtc(beforeDST);
    assertEquals(LocalDateTime.of(2023, 3, 26, 0, 30), afterDST);
}

Сложные ситуации: специфические требования

Иногда бывает необходимо просто сдвинуть время, не преобразуя его в UTC:

Java
Скопировать код
ZoneOffset currentOffset = ZonedDateTime.now(ZoneId.systemDefault()).getOffset();

Либо преобразовать LocalDateTime в Instant:

Java
Скопировать код
Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();

Такой подход будет полезен при работе с классом Instant в случае взаимодействия с различными API.

Полезные материалы

  1. LocalDateTime (Java Platform SE 8) — документация по LocalDateTime.
  2. ZonedDateTime (Java Platform SE 8) — описание использования ZonedDateTime.
  3. java – В чём разница между Instant и LocalDateTime? – Stack Overflow — обсуждение различий между Instant и LocalDateTime.
  4. Класс Instant (Учебники по Java™ > Дата и Время > Стандартный Календарь) — глубокое погружение в Instant.
  5. Java LocalDateTime – Javatpoint — подробный разбор LocalDateTime.
  6. Дата и время в Java SE 8 — обзор нововведений в работе с датой и временем в Java.