我想知道是否可以在Java 8中将LocalDate转换为OffsetDateTime。
例如,假设我有此LocalDate:
1992-12-28
然后,我希望将其转换为此OffsetDateTime
:
1992-12-28T00:00-03:00
假设我们知道时区,例如美国/圣地亚哥。
答案 0 :(得分:4)
有很多方法可以将 LocalDate
转换为 OffsetDateTime
。下面列出了其中一些:
1.使用 LocalDate#atStartOfDay(ZoneId zone)
=> ZonedDateTime#toOffsetDateTime()
:
LocalDate date = LocalDate.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = date.atStartOfDay(offset).toOffsetDateTime();
这也可以在您有 ZoneId
可用时使用,例如
LocalDate date = LocalDate.now();
// You can use a custom ZoneId e.g. ZoneId.of("Europe/London")
ZoneId zoneId = ZoneId.systemDefault();
OffsetDateTime odt = date.atStartOfDay(zoneId).toOffsetDateTime();
2.使用 LocalDate#atStartOfDay()
=> LocalDateTime#atOffset(ZoneOffset offset)
:
LocalDate date = LocalDate.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = date.atStartOfDay().atOffset(offset);
3.使用 LocalDate#atTime(OffsetTime time)
:
LocalDate date = LocalDate.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = date.atTime(OffsetTime.of(LocalTime.MIDNIGHT, offset));
4.使用 OffsetDateTime#of(LocalDate date, LocalTime time, ZoneOffset offset)
:
LocalDate date = LocalDate.now();
ZoneOffset offset = ZoneOffset.UTC;
OffsetDateTime odt = OffsetDateTime.of(date, LocalTime.MIDNIGHT, offset);
注意事项:
ZoneOffset
,例如ZoneOffset offset = ZoneOffset.of("+02:00")
。LocalDate
,例如LocalDate date = LocalDate.of(2021, 3, 14)
。答案 1 :(得分:1)
我们在项目中一直这样做。特别是检查日期是否在给定的日期范围内。这是我们的做法。
public static OffsetDateTime getOffsetDateTime(LocalDate date, String zone) {
return date.atStartOfDay(ZoneId.of(zone)).toOffsetDateTime();
}
区域看起来像 Australia/Melbourne
或 UTC
。如果您有句柄,您也可以直接使用 ZoneId。将它设置在特定区域很重要,因为 OffsetDateTime 将日期时间与区域。
调用如下
String defaultZone = "Australia/Melbourne";
OffsetDateTime meetingStartDate = DateUtils.getOffsetDateTime(project.getCanStartDate(), defaultZone);
答案 2 :(得分:0)
您可以尝试一下。
OffsetDateTime o = OffsetDateTime.of(LocalDate.now(),LocalTime.NOON, ZoneOffset.UTC);
OffsetDateTime o1 = OffsetDateTime.of(LocalDateTime.now(), ZoneOffset.UTC);
答案 3 :(得分:0)
假设您实际上有LocalDateTime
,则可以这样做:
ZoneOffset zoneOffset = ZoneOffset.ofHours(2);
OffsetDateTime offsetDateTime = ldt.atOffset(zoneOffset);
将ldt
作为您的LocalDateTime
实例。
答案 4 :(得分:0)
我可以自由地在您的问题中编辑一些假设。一些合理的方法,恕我直言,但您应该检查一下。如果那里有问题,请更正。在这些假设下,正确的转换是:
ZoneId zone = ZoneId.of("Europe/Madrid");
LocalDate date = LocalDate.of(2019, Month.JULY, 27);
OffsetDateTime odt = date.atStartOfDay(zone)
.toOffsetDateTime();
System.out.println(odt);
输出:
2019-07-27T00:00 + 02:00
Java知道夏令时(DST),并在考虑夏令时的情况下找到时区的正确偏移量。我调用的atStartOfDay
方法产生一个ZonedDateTime
,即带有时区的日期和时间。它具有toOffsetDateTime
方法,可转换为您要求的OffsetDateTime
。