Java 8 - 将 LocalDate 转换为 OffsetDateTime

Java 8 - Convert LocalDate to OffsetDateTime

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

例如假设我有这个 LocalDate:

1992-12-28

然后我想把它转换成这个 OffsetDateTime:

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

假设我们知道时区,例如America/Santiago。

你可以试试这个..

OffsetDateTime o = OffsetDateTime.of(LocalDate.now(),LocalTime.NOON, ZoneOffset.UTC);
OffsetDateTime o1 = OffsetDateTime.of(LocalDateTime.now(), ZoneOffset.UTC);

假设您实际上有 LocalDateTime,您可以这样做:

ZoneOffset zoneOffset = ZoneOffset.ofHours(2);
OffsetDateTime offsetDateTime = ldt.atOffset(zoneOffset);

ldt 是您的 LocalDateTime 实例。

我自由地在你的问题中编辑了一些假设。一些合理的,恕我直言,但你应该检查一下。如有不妥请指正。在这些假设下,正确的转换是:

    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

有很多方法可以将 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).

我们在项目中一直这样做。特别是检查日期是否在给定的日期范围内。这是我们的做法。

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