Java 8 - 将 LocalDate 转换为 OffsetDateTime



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

例如,假设我得到了这个本地日期:

1992-12-28

然后我想将其转换为此OffsetDateTime

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

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

你可以

试试这个。

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

我自由地将一些假设编辑到您的问题中。恕我直言,一些合理的,但你应该检查一下。如果那里有问题,请纠正。在这些假设下,正确的转换是:

    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,即带有时区的日期和时间。它具有转换为您要求OffsetDateTimetoOffsetDateTime方法。

有很多

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

假设你真的有LocalDateTime,你可以这样做:

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

ldt是您LocalDateTime实例。

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

public static OffsetDateTime getOffsetDateTime(LocalDate date, String zone) {
    return date.atStartOfDay(ZoneId.of(zone)).toOffsetDateTime();
}

该区域看起来像 Australia/MelbourneUTC .如果您有 ZoneId 的句柄,也可以直接使用 ZoneId。在特定区域设置它很重要,因为 OffsetDateTime 将与区域约会时间。

调用如下所示

String defaultZone = "Australia/Melbourne";
OffsetDateTime meetingStartDate = DateUtils.getOffsetDateTime(project.getCanStartDate(), defaultZone);

最新更新