1

如何将 instatiated ZonedDateTime 的时间更改为 fe: 'java.time.LocalTime.MIN' 或 'java.time.LocalTime.MAX'?

ZonedDateTime date = ZonedDateTime.now();

这是一个好的开始:ZonedDateTime startDate = date.withHour(0).withMinute(0).withSecond(0).withNano(0);

但最好有: ZonedDateTime startDate = date.withTime(LocalTime.Min);

4

3 回答 3

4

对于 ZonedDateTime 中的 Time 最小值,这是相当短的:

ZonedDateTime.now().truncatedTo(ChronoUnit.DAYS);

它将切断(设置为零):来自 ZonedDateTime 的小时、分钟、秒和纳秒。

这对于 ZonedDateTime 中的最大值时间:

ZonedDateTime.now().withHour(23).withMinute(59).withSecond(59).withNano(LocalTime.MAX.getNano());
于 2018-02-19T14:55:23.023 回答
3

正确的方法是:

    System.out.println(date.toLocalDate().atStartOfDay(date.getZone()));
    System.out.println(date.toLocalDate()
            .plusDays(1)
            .atStartOfDay(date.getZone())
            .minusNanos(1));

人们可能很容易期望date.with(LocalTime.MIN)date.with(LocalTime.MAX)完成这项工作,它可能会给您带来想要的结果。LocalTime.MIN请注意,由于过渡到夏令时 (DST) 和其他异常情况,当天该区域不存在时间 00:00(这是 的定义)的(罕见)情况。上面清楚地考虑到了这一点,也让你的读者毫不怀疑在这种情况下会发生什么。

但是,如果您只需要比较日期,只需摆脱一天中的时间并比较日期:

    ZonedDateTime otherDate = ZonedDateTime.of(2018, 2, 20, 13, 45, 0, 0,
                                ZoneId.of("America/Santa_Isabel"));
    if (date.toLocalDate().isAfter(otherDate.toLocalDate())) {
        // ...
    }
于 2018-02-19T16:23:35.307 回答
1

您可以使用 .with(TemporalAdjuster)。您可以使用 TemporalAdjust.adjustInto(Temporal) 调整 TemporalAdjuster:

https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalAdjuster.html https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime .html

于 2018-02-19T14:41:16.340 回答