如何将LocalDateTime转换为OffsetDateTime?

如何将LocalDateTime转换为OffsetDateTime?,datetime,java-8,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将返回LocalDa

如何将LocalDateTime转换为OffsetDateTime

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

Payment::getEntryDate
将返回
LocalDateTime

您需要获取创建OffsetDateTime时使用的区域偏移量。一种方法是为您的位置使用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
那么:

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

OffsetDateTime只是从UTC偏移的日期时间

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

OffsetDateTime.of(localDateTime, ZoneOffset.of("+2"));
OffsetDateTime.of(localDateTime, ZoneOffset.of("+02"));
OffsetDateTime.of(localDateTime, ZoneOffset.of("+02:00"));
大多数情况下,您希望获得特定时区的偏移量,在这种情况下,最好使用
ZoneDateTime
,因为对于大多数时区,夏季/冬季的偏移量不同,
ZoneDateTime
将自动为您处理

如果您绝对想要偏移特定时区的
OffsetDateTime
,可以编写:

localDateTime.atZone(ZoneId.of("Europe/Paris")).toOffsetDateTime();
以下是我的解决方案:

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

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

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

1。使用:

LocalDateTime ldt = LocalDateTime.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = ldt.atOffset(offset);
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();
LocalDateTime ldt = LocalDateTime.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = OffsetDateTime.of(ldt, offset);
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();
2。使用=>:

LocalDateTime ldt = LocalDateTime.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = ldt.atOffset(offset);
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();
LocalDateTime ldt = LocalDateTime.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = OffsetDateTime.of(ldt, offset);
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();
3。使用:

LocalDateTime ldt = LocalDateTime.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = ldt.atOffset(offset);
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();
LocalDateTime ldt = LocalDateTime.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = OffsetDateTime.of(ldt, offset);
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();
4.=><代码>ZonedDateTime#toOffsetDateTime():

LocalDateTime ldt = LocalDateTime.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = ldt.atOffset(offset);
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();
LocalDateTime ldt = LocalDateTime.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = OffsetDateTime.of(ldt, offset);
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();

注意事项:

LocalDateTime ldt = LocalDateTime.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = ldt.atOffset(offset);
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();
LocalDateTime ldt = LocalDateTime.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = OffsetDateTime.of(ldt, offset);
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();
  • 在上述所有解决方案中,根据需要更换样本
    ZoneOffset
    ,例如,
    ZoneOffset offset=ZoneOffset.of(“+02:00”)
  • 在上面给出的所有解决方案中,根据需要替换示例
    LocalDateTime
    ,例如
    LocalDateTime ldt=LocalDateTime.of(2021,3,14,10,20)

  • OffsetDataTime::of(LocalDataTime,ZoneOffset)
    ?如何获取该ZoneOffset?从何处获取?这取决于你是否知道,我的意思是一个
    LocalDataTime
    就是,一个本地。。。无论您想应用什么偏移量,都有一些预定义的类型,最常见的
    UTC
    我想我需要保留所有信息,因此我猜不出要使用哪个区域偏移量。请详细解释。您可以提供一个LocalDateTime对象,然后在localmaschine上创建偏移量。然后使用此偏移量创建offsetDateTime并返回它。由于LocalDateTime不存储原始偏移量,因此原始偏移量仍然丢失,因此我们必须创建它。如果需要jvm默认时区的偏移量,可以将其写入一行:
    ldt.atZone(ZoneId.systemDefault()).toOffsetDateTime()