我想知道是否可以在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);
输出:
Java 知道夏令时2019-07-27T00:00+02:00
(DST(,并在考虑夏令时的情况下找到时区的正确偏移量。我称之为atStartOfDay
方法产生一个ZonedDateTime
,即带有时区的日期和时间。它具有转换为您要求OffsetDateTime
的toOffsetDateTime
方法。
方法可以将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)
.
假设你真的有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/Melbourne
或UTC
.如果您有 ZoneId 的句柄,也可以直接使用 ZoneId。在特定区域设置它很重要,因为 OffsetDateTime 将与区域约会时间。
调用如下所示
String defaultZone = "Australia/Melbourne";
OffsetDateTime meetingStartDate = DateUtils.getOffsetDateTime(project.getCanStartDate(), defaultZone);