Java 8减去日期但保留小时

我想从现在减去 7 天,但要保留时间,所以如果现在是 12/09/2018 的 18:30,请在 18:30 获取 05/09/2018...


我试过了:


public static Date subtractDays (int numDaysToSubstract) {

        LocalDate now = LocalDate.now().minusDays(numDaysToSubstract); 

        return Date.from(now.atStartOfDay(ZoneId.systemDefault()).toInstant());

    }

但是我在 05/09/2018 的 00:00 收到了


慕娘9325324
浏览 181回答 3
3回答

梵蒂冈之花

正如其他人的建议,LocalDate并且atStartOfDay应该是仅仅基于他们的名字红旗。它们是描述时间的错误类型和维护时间的错误方法。这也是一种毫无意义的经历LocalDateTime来,然后将其转换为一个Instant。Instant直接使用public static Date subtractDays(int numDaysToSubstract) {    return Date.from(Instant.now().minus(numDaysToSubstract, ChronoUnit.DAYS));    // or    // return Date.from(Instant.now().minus(Duration.ofDays(numDaysToSubstract)));}(我假设您正在使用java.util.Date是因为与某些旧 API 兼容。)

慕姐4208626

从到目前为止发布的其他答案中的代码中不清楚他们如何处理夏令时 (DST) 和其他时间异常。他们以不同的方式这样做。为了更清楚地表明,如果现在是 18.30,您上周想要 18.30,无论在此期间是否发生了夏季时间的过渡,我建议使用ZonedDateTime:    System.out.println("Now:                 " + Instant.now());    Instant aWeekAgo = ZonedDateTime.now(ZoneId.of("Europe/Madrid"))            .minusWeeks(1)            .toInstant();    System.out.println("A week ago in Spain: " + aWeekAgo);由于西班牙的夏季时间在上周还没有结束或开始,因此运行刚才的代码片段也给出了 UTC 中的同一时间(Instant打印的内容):Now:                 2018-09-13T09:46:58.066957ZA week ago in Spain: 2018-09-06T09:46:58.102680Z我相信你会根据你的代码调整这个想法。

BIG阳

使用类LocalDateTime代替LocalDate(不包含时间组件..)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java