Укажите часовой пояс ZonedDateTime без изменения фактической даты. - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть объект 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 ]

0 голосов
/ 08 ноября 2018

Вы можете использовать метод 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
0 голосов
/ 08 ноября 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.

0 голосов
/ 08 ноября 2018
 ZonedId zoneId = ZoneId.of("Europe/Paris");
 return ZonedDateTime.of(LocalDateTime.ofInstant(date.toInstant(),zonedId);

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

...