Укажите часовой пояс 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 в Европу / Париж, а не наоборот.
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
Так как старомодный 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
,
ZonedId zoneId = ZoneId.of("Europe/Paris");
return ZonedDateTime.of(LocalDateTime.ofInstant(date.toInstant(),zonedId);
Попробуйте определить ZoneId, то есть Европа / Париж