Java 日期设置分秒为0

Java Date set the minutes and seconds to 0

我想将日期的分秒设置为0, 但我发现这些方法已被弃用

Date yesterday = Date.from(Instant.now().minus(24, ChronoUnit.HOURS));

    yesterday.setMinutes(0);
                yesterday.setSeconds(0);

TL;DR

    ZonedDateTime yesterday = ZonedDateTime.now(ZoneId.of("Europe/Madrid"))
            .minusDays(1)
            .truncatedTo(ChronoUnit.HOURS);
    System.out.println("Yesterday with minutes and seconds set to 0: " + yesterday);

运行刚刚给了

Yesterday with minutes and seconds set to 0: 2019-03-17T23:00+01:00[Europe/Madrid]

定义昨天

如果您打算“昨天同一时间”,那并不总是 24 小时前。由于夏令时 (DST) 和其他异常情况,一天可能是 23、23,5 或 25 小时。

java.time

java.time 的 ZonedDateTime class,现代 Java 日期和时间 API,考虑了您所在时区的时间异常。所以当你减去一天时,你得到的是昨天的相同时间,如果那个时间存在的话。

.truncatedTo(ChronoUnit.HOURS) 将相关时区的分钟、秒和秒的小数部分设置为 0。

您尝试使用 Date class,但在 Java 8 中您不应该这样做。它设计不佳且早已过时。我发现 java.time 更好用。

如果你不可或缺地需要一个老式的日期

您可能需要 Date 来获得您现在无法更改或无力更改的遗产 API。在那种情况下只在最后一刻转换:

    Instant yesterdayInstant = yesterday.toInstant();
    Date yesterdayDate = Date.from(yesterdayInstant);
    System.out.println("As old-fashoined Date: " + yesterdayDate);

在我的时区(Europe/Copenhagen,目前与Europe/Madrid一致)我得到了

As old-fashoined Date: Sun Mar 17 23:00:00 CET 2019

Link

Oracle Tutorial: Date Time 解释如何使用 java.time.