Java 8 - 将 LocalDate 转换为 OffsetDateTime

San*_*Rey 9 java datetime date datetime-conversion java-8

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

例如假设我有这个 LocalDate:

1992-12-28
Run Code Online (Sandbox Code Playgroud)

然后我想把它转换成这样OffsetDateTime

1992-12-28T00:00-03:00
Run Code Online (Sandbox Code Playgroud)

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

Ole*_*.V. 9

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

    ZoneId zone = ZoneId.of("Europe/Madrid");
    LocalDate date = LocalDate.of(2019, Month.JULY, 27);
    OffsetDateTime odt = date.atStartOfDay(zone)
            .toOffsetDateTime();
    System.out.println(odt);
Run Code Online (Sandbox Code Playgroud)

输出:

2019-07-27T00:00+02:00

Java 知道夏令时 (DST) 并在考虑夏令时找到正确的时区偏移量。atStartOfDay我调用的方法会生成一个ZonedDateTime,即带时区的日期和时间。它有一种toOffsetDateTime转换为OffsetDateTime您要求的方法。


小智 7

你可以试试这个..

OffsetDateTime o = OffsetDateTime.of(LocalDate.now(),LocalTime.NOON, ZoneOffset.UTC);
OffsetDateTime o1 = OffsetDateTime.of(LocalDateTime.now(), ZoneOffset.UTC);
Run Code Online (Sandbox Code Playgroud)


Arv*_*ash 6

有很多方法可以转换LocalDateOffsetDateTime. 下面列出了其中一些:

\n

1. 使用LocalDate#atStartOfDay\xe2\x80\x8b(ZoneId zone)=> ZonedDateTime#toOffsetDateTime()

\n
LocalDate date = LocalDate.now();\nZoneOffset offset = ZoneOffset.UTC;\nOffsetDateTime odt = date.atStartOfDay(offset).toOffsetDateTime();\n
Run Code Online (Sandbox Code Playgroud)\n

当您有可用的情况时,也可以使用此方法,ZoneId例如

\n
LocalDate date = LocalDate.now();\n\n// You can use a custom ZoneId e.g. ZoneId.of("Europe/London")\nZoneId zoneId = ZoneId.systemDefault(); \n\nOffsetDateTime odt = date.atStartOfDay(zoneId).toOffsetDateTime();\n
Run Code Online (Sandbox Code Playgroud)\n

2. 使用LocalDate#atStartOfDay()=> LocalDateTime#atOffset\xe2\x80\x8b(ZoneOffset offset)

\n
LocalDate date = LocalDate.now();\nZoneOffset offset = ZoneOffset.UTC;\nOffsetDateTime odt = date.atStartOfDay().atOffset(offset);\n
Run Code Online (Sandbox Code Playgroud)\n

3. 使用LocalDate#atTime(OffsetTime time)

\n
LocalDate date = LocalDate.now();\nZoneOffset offset = ZoneOffset.UTC;\nOffsetDateTime odt = date.atTime(OffsetTime.of(LocalTime.MIDNIGHT, offset));\n
Run Code Online (Sandbox Code Playgroud)\n

4. 使用OffsetDateTime#of\xe2\x80\x8b(LocalDate date, LocalTime time, ZoneOffset offset)

\n
LocalDate date = LocalDate.now();\nZoneOffset offset = ZoneOffset.UTC;\nOffsetDateTime odt = OffsetDateTime.of(date, LocalTime.MIDNIGHT, offset);\n
Run Code Online (Sandbox Code Playgroud)\n
\n

笔记:

\n
    \n
  1. ZoneOffset在上面给出的所有解决方案中,根据需要更换样品,例如ZoneOffset offset = ZoneOffset.of("+02:00")
  2. \n
  3. LocalDate在上面给出的所有解决方案中,根据需要更换样品,例如LocalDate date = LocalDate.of(2021, 3, 14)
  4. \n
\n