【问题标题】:ZonedDateTime how to set min or max time?ZonedDateTime 如何设置最小或最大时间?
【发布时间】:2018-07-29 19:44:48
【问题描述】:

如何将 instatiated ZonedDateTime 的时间更改为 f.e.: '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);

【问题讨论】:

  • 比较器需要那个吗?
  • 我需要有两次手术之间的日期。我不需要时间。
  • 这看起来像是 XY 问题。为什么你认为你需要这个?

标签: java time java-8 java-time zoneddatetime


【解决方案1】:

这对于 ZonedDateTime 中的最小时间值非常短:

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

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

这是 ZonedDateTime 中时间的最大值:

ZonedDateTime.now().withHour(23).withMinute(59).withSecond(59).withNano(LocalTime.MAX.getNano());

【讨论】:

  • 对于最大值,你可以用更少的方法调用(和更少的临时对象),以及更少的魔法值,如果你这样做:ZonedDateTime.now().plusDays(1).truncatedTo(ChronoUnit.DAYS).minusNanos(1);
  • 在我看来它是完成使用。我更喜欢更长的路
  • 如果一天的最后一分钟是 61 秒而不是 60 秒,那么有闰秒的日子呢?
【解决方案2】:

正确的做法是:

    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) 完成这项工作,它可能会给您带来想要的结果。请注意,由于过渡到夏令时 (DST) 和其他异常情况,当天该区域中不存在时间 00:00(这是 LocalTime.MIN 的定义)的(罕见)情况。上面清楚地考虑到了这一点,也让您的读者对在这种情况下会发生什么毫无疑问。

但是,如果您只需要比较日期,只需去掉一天中的时间并比较日期即可:

    ZonedDateTime otherDate = ZonedDateTime.of(2018, 2, 20, 13, 45, 0, 0,
                                ZoneId.of("America/Santa_Isabel"));
    if (date.toLocalDate().isAfter(otherDate.toLocalDate())) {
        // ...
    }

【讨论】:

    【解决方案3】:

    您可以使用 .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

    【讨论】:

    • 这个建议不错,但也不足以解决OP的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多