Java 8-将LocalDate转换为OffsetDateTime

时间:2019-07-26 06:43:35

标签: java date datetime java-8 datetime-conversion

我想知道是否可以在Java 8中将LocalDate转换为OffsetDateTime。

例如,假设我有此LocalDate:

1992-12-28

然后,我希望将其转换为此OffsetDateTime

1992-12-28T00:00-03:00

假设我们知道时区,例如美国/圣地亚哥。

5 个答案:

答案 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);

注意事项:

  1. 在上面给出的所有解决方案中,根据需要替换示例 ZoneOffset,例如ZoneOffset offset = ZoneOffset.of("+02:00")
  2. 在上面给出的所有解决方案中,根据需要替换示例 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/MelbourneUTC。如果您有句柄,您也可以直接使用 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