如何将LocalDateTime转换为OffsetDateTime?

时间:2019-04-01 12:04:59

标签: datetime java-8

如何将LocalDateTime转换为OffsetDateTime?

private OffsetDateTime getEntryDate(Payment payment){
    return Optional.ofNullable(payment).map(Payment::getEntryDate).map(SHOULD RETURN OffsetDateTime)
            .orElse(null);
}

Payment::getEntryDate将返回LocalDateTime

5 个答案:

答案 0 :(得分:6)

有很多方法可以将 LocalDateTime 转换为 OffsetDateTime。下面列出了其中一些:

1.使用 LocalDateTime#atOffset​(ZoneOffset offset)

LocalDateTime ldt = LocalDateTime.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = ldt.atOffset(offset);

2.使用 LocalDateTime#atZone​(ZoneId zone) => ZonedDateTime#toOffsetDateTime()

LocalDateTime ldt = LocalDateTime.now();

// Change the ZoneId as required e.g. ZoneId.of("Europe/London")
ZoneId zoneId = ZoneId.systemDefault();

OffsetDateTime odt = ldt.atZone(zoneId).toOffsetDateTime();

3.使用 OffsetDateTime#of​(LocalDateTime dateTime, ZoneOffset offset)

LocalDateTime ldt = LocalDateTime.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = OffsetDateTime.of(ldt, offset);

4. ZonedDateTime#of​(LocalDateTime localDateTime, ZoneId zone) => ZonedDateTime#toOffsetDateTime()

LocalDateTime ldt = LocalDateTime.now();

// Change the ZoneId as required e.g. ZoneId.of("Europe/London")
ZoneId zoneId = ZoneId.systemDefault();

OffsetDateTime odt = ZonedDateTime.of(ldt, zoneId).toOffsetDateTime();

注意事项:

  1. 在上面给出的所有解决方案中,根据需要替换示例 ZoneOffset,例如ZoneOffset offset = ZoneOffset.of("+02:00")
  2. 在上面给出的所有解决方案中,根据需要替换示例 LocalDateTime,例如LocalDateTime ldt = LocalDateTime.of(2021, 3, 14, 10, 20)

答案 1 :(得分:2)

您需要获取在创建OffsetDateTime时要使用的ZoneOffset。一种方法是对您的位置使用ZoneId:

final ZoneId zone = ZoneId.of("Europe/Paris");
LocalDateTime localDateTime = LocalDateTime.now();
ZoneOffset zoneOffSet = zone.getRules().getOffset(localDateTime);
OffsetDateTime offsetDateTime = localDateTime.atOffset(zoneOffSet);
System.out.println(offsetDateTime); // 2019-08-08T09:54:10.761+02:00

答案 2 :(得分:0)

怎么样:

 OffsetDateTime convertToOffsetDateTime(LocalDateTime ldt) {
        ZoneOffset offset = OffsetDateTime.now().getOffset();
        OffsetDateTime offsetDateTime = ldt.atOffset(offset);
        return offsetDateTime;
    }

答案 3 :(得分:0)

OffsetDateTime只是日期时间,与UTC的时间有偏移。

因此,如果您有固定的偏移量(例如,UTC中的+02),则可以像这样转换localDateTime:

OffsetDateTime.of(localDateTime, ZoneOffset.of("+2"));
OffsetDateTime.of(localDateTime, ZoneOffset.of("+02"));
OffsetDateTime.of(localDateTime, ZoneOffset.of("+02:00"));

在大多数情况下,您希望具有特定时区的偏移量,在这种情况下,最好使用ZonedDateTime,因为对于大多数时区,夏/冬和{{ 1}}会自动为您处理。

如果您绝对希望ZonedDateTime与特定时区有偏差,则可以编写:

OffsetDateTime

答案 4 :(得分:0)

这是我的解决方案:

public Instant toInstant(LocalDate date) {
    return date
        .atStartOfDay()
        .toInstant(ZoneOffset.UTC);
}

public OffsetDateTime toOffsetDateTime(LocalDate date) {
    return OffsetDateTime.ofInstant(
        toInstant(date),
        ZoneOffset.UTC
    );
}