it-swarm.com.ru

Конвертировать LocalDateTime в LocalDateTime в UTC

Конвертировать LocalDateTime в LocalDateTime в UTC.

LocalDateTime convertToUtc(LocalDateTime date) {

    //do conversion

}

Я искал по сети. Но не получил решение

50
1355

Есть еще более простой способ

LocalDateTime.now(Clock.systemUTC())
72
Leon Radley

Я лично предпочитаю

LocalDateTime.now(ZoneOffset.UTC);

так как это самый читаемый вариант.

54
slorinc

LocalDateTime не содержит информацию о зоне. ZonedDatetime делает.

Если вы хотите конвертировать LocalDateTime в UTC, вам нужно заключить в кулак ZonedDateTime.

Вы можете конвертировать, как показано ниже.

LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt.toLocalTime());

ZonedDateTime ldtZoned = ldt.atZone(ZoneId.systemDefault());

ZonedDateTime utcZoned = ldtZoned.withZoneSameInstant(ZoneId.of("UTC"));

System.out.println(utcZoned.toLocalTime());
36
Fatih Arslan

Используйте ниже. Он берет местное время и конвертирует его в UTC, используя часовой пояс. Вам не нужно создавать его функции.

ZonedDateTime nowUTC = ZonedDateTime.now(ZoneOffset.UTC);
System.out.println(nowUTC.toString());

Если вам нужно получить часть LocalDateTime ZonedDateTime, вы можете использовать следующее.

nowUTC.toLocalDateTime();

Вот статический метод, который я использую в своем приложении для вставки времени UTC в mysql, поскольку я не могу добавить значение по умолчанию TC_TIMESTAMP в столбец datetime.

public static LocalDateTime getLocalDateTimeInUTC(){
    ZonedDateTime nowUTC = ZonedDateTime.now(ZoneOffset.UTC);

    return nowUTC.toLocalDateTime();
}
11
patelb

Вот простой маленький служебный класс, который вы можете использовать для преобразования локального времени даты из зоны в зону, включая метод утилит для непосредственного преобразования локального времени даты из текущей зоны в UTC (с помощью метода main, чтобы вы могли запустить его и посмотреть результаты простого теста):

import Java.time.LocalDateTime;
import Java.time.ZoneId;
import Java.time.ZoneOffset;
import Java.time.ZonedDateTime;

public final class DateTimeUtil {
    private DateTimeUtil() {
        super();
    }

    public static void main(final String... args) {
        final LocalDateTime now = LocalDateTime.now();
        final LocalDateTime utc = DateTimeUtil.toUtc(now);

        System.out.println("Now: " + now);
        System.out.println("UTC: " + utc);
    }

    public static LocalDateTime toZone(final LocalDateTime time, final ZoneId fromZone, final ZoneId toZone) {
        final ZonedDateTime zonedtime = time.atZone(fromZone);
        final ZonedDateTime converted = zonedtime.withZoneSameInstant(toZone);
        return converted.toLocalDateTime();
    }

    public static LocalDateTime toZone(final LocalDateTime time, final ZoneId toZone) {
        return DateTimeUtil.toZone(time, ZoneId.systemDefault(), toZone);
    }

    public static LocalDateTime toUtc(final LocalDateTime time, final ZoneId fromZone) {
        return DateTimeUtil.toZone(time, fromZone, ZoneOffset.UTC);
    }

    public static LocalDateTime toUtc(final LocalDateTime time) {
        return DateTimeUtil.toUtc(time, ZoneId.systemDefault());
    }
}
9
ManoDestra

tLDR: просто нет возможности сделать это; если вы пытаетесь это сделать, вы ошибаетесь LocalDateTime .

Причина в том, что LocalDateTime не записывает часовой пояс после создания экземпляров. Вы не можете конвертировать дату и время без часового пояса в другое время на основе определенного часового пояса.

На самом деле LocalDateTime.now () никогда не следует вызывать в производственном коде, если только ваша цель - не получить случайные результаты. Когда вы создаете экземпляр LocalDateTime подобным образом, этот экземпляр содержит ТОЛЬКО дату и время, основанные на часовом поясе текущего сервера, что означает, что этот фрагмент кода будет генерировать другой результат если на нем работает сервер с другой конфигурацией часового пояса.

LocalDateTime может упростить вычисление даты. Если вам нужно реальное универсально используемое время данных, используйте ZonedDateTime или OffsetDateTime: https://docs.Oracle.com/javase/8/docs/api/Java/time/OffsetDateTime.html .

2
Andrew Feng

Вопрос?

Глядя на ответы и вопрос, кажется, что вопрос был значительно изменен. Итак, чтобы ответить на текущий вопрос:

Конвертировать LocalDateTime в LocalDateTime в UTC.

Часовой пояс?

LocalDateTime не хранит никакой информации о часовом поясе, он просто содержит значения года, месяца, дня, часа, минуты, секунды и меньших единиц. Итак, важный вопрос: Каков часовой пояс исходного LocalDateTime? Это может быть уже UTC, поэтому преобразование не требуется.

Системный часовой пояс по умолчанию

Учитывая, что вы все равно задали вопрос, вы, вероятно, имели в виду, что исходное время находится в часовом поясе вашей системы по умолчанию, и вы хотите преобразовать его в UTC. Потому что обычно объект LocalDateTime создается с помощью LocalDateTime.now(), которая возвращает текущее время в системном часовом поясе по умолчанию. В этом случае преобразование будет следующим:

LocalDateTime convertToUtc(LocalDateTime time) {
    return time.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}

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

2019-02-25 11:39 // [time] original LocalDateTime without a timezone
2019-02-25 11:39 GMT+1 // [atZone] converted to ZonedDateTime (system timezone is Madrid)
2019-02-25 10:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime
2019-02-25 10:39 // [toLocalDateTime] losing the timezone information

Явный часовой пояс

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

LocalDateTime convertToUtc(LocalDateTime time, ZoneId zone) {
    return time.atZone(zone).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}

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

2019-02-25 11:39 // [time] original LocalDateTime without a timezone
2019-02-25 11:39 GMT+2 // [atZone] converted to ZonedDateTime (zone is Europe/Tallinn)
2019-02-25 09:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime
2019-02-25 09:39 // [toLocalDateTime] losing the timezone information

Метод atZone()

Результат метода atZone() зависит от времени, переданного в качестве его аргумента, поскольку он учитывает все правила часового пояса, включая летнее время (DST). В примерах время было 25 февраля, в Европе это означает зимнее время (без летнего времени).

Если бы мы использовали другую дату, скажем, 25 августа с прошлого года, результат был бы другим, учитывая DST:

2018-08-25 11:39 // [time] original LocalDateTime without a timezone
2018-08-25 11:39 GMT+3 // [atZone] converted to ZonedDateTime (zone is Europe/Tallinn)
2018-08-25 08:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime
2018-08-25 08:39 // [toLocalDateTime] losing the timezone information

Время по Гринвичу не меняется. Поэтому смещения в других часовых поясах корректируются. В этом примере летнее время Эстонии составляет GMT + 3, а зимнее время GMT + 2.

Также, если вы укажете время перехода часов на один час назад. Например. 28 октября 2018 года 03:30 для Эстонии это может означать два разных времени:

2018-10-28 03:30 GMT+3 // summer time [UTC 2018-10-28 00:30]
2018-10-28 04:00 GMT+3 // clocks are turned back 1 hour [UTC 2018-10-28 01:00]
2018-10-28 03:00 GMT+2 // same as above [UTC 2018-10-28 01:00]
2018-10-28 03:30 GMT+2 // winter time [UTC 2018-10-28 01:30]

Без указания смещения вручную (GMT + 2 или GMT + 3) время 03:30 для часового пояса Europe/Tallinn может означать два разных времени UTC и два разных смещения.

Резюме

Как видите, конечный результат зависит от часового пояса времени, переданного в качестве аргумента. Поскольку часовой пояс не может быть извлечен из объекта LocalDateTime, вы должны сами знать, из какого часового пояса он поступает, чтобы преобразовать его в UTC.

1
anddero