如何将LocalDateTime转换为OffsetDateTime?
private OffsetDateTime getEntryDate(Payment payment){
return Optional.ofNullable(payment).map(Payment::getEntryDate).map(SHOULD RETURN OffsetDateTime)
.orElse(null);
}
Payment::getEntryDate
将返回LocalDateTime
答案 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();
注意事项:
ZoneOffset
,例如ZoneOffset offset = ZoneOffset.of("+02:00")
。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
);
}