Укажите часовой пояс ZonedDateTime без изменения фактической даты

У меня есть объект Date, который содержит дату (не текущую дату), и мне нужно каким-то образом указать, что эта дата — UTC, а затем преобразовать ее в «Европа/Париж», что составляет +1 час.

public static LocalDateTime toLocalDateTime(Date date){
    return ZonedDateTime.of(LocalDateTime.ofInstant(date.toInstant(), ZoneOffset.UTC), ZoneId.of("Europe/Paris")).toLocalDateTime();
}

Учитывая дату «2018-11-08 15:00:00», это преобразует дату в «2018-11-08 14:00:00». Мне нужно конвертировать из UTC в Европу/Париж, а не наоборот.


person MatMat    schedule 08.11.2018    source источник
comment
Это должно помочь: на основе разницы во времени в текущем часовом поясе и восточном"> stackoverflow.com/questions/42280454/   -  person UninformedUser    schedule 08.11.2018
comment
Зачем проходить через LocalDateTime, если можно напрямую построить ZonedDateTime из Instant?   -  person M. Prokhorov    schedule 08.11.2018


Ответы (3)


Вы можете использовать ZonedDateTime.withZoneSameInstant() способ перехода с UTC на парижское время:

Date date = new Date();
ZonedDateTime utc = date.toInstant().atZone(ZoneOffset.UTC);
ZonedDateTime paris = utc.withZoneSameInstant(ZoneId.of("Europe/Paris"));
System.out.println(utc);
System.out.println(paris);
System.out.println(paris.toLocalDateTime());

который печатает:

2018-11-08T10:25:18.223Z
2018-11-08T11:25:18.223+01:00[Europe/Paris]
2018-11-08T11:25:18.223
person Karol Dowbecki    schedule 08.11.2018

Поскольку старомодный объект Date не имеет часового пояса, вы можете полностью игнорировать UTC и просто напрямую преобразовать его в Европу/Париж:

private static final ZoneId TARGET_ZONE = ZoneId.of("Europe/Paris");

public static LocalDateTime toLocalDateTime(Date date){
    return date.toInstant().atZone(TARGET_ZONE).toLocalDateTime();
}

Однако я не уверен, почему вы хотите вернуть LocalDateTime. Это выбрасывание информации. В большинстве случаев я бы пропустил .toLocalDateTime() и просто вернул ZonedDateTime из atZone.

person Ole V.V.    schedule 08.11.2018

 ZonedId zoneId = ZoneId.of("Europe/Paris");
 return ZonedDateTime.of(LocalDateTime.ofInstant(date.toInstant(),zonedId);

Попробуйте определить ZoneId, который является Европой/Парижем

person malvern dongeni    schedule 08.11.2018