为了账号安全,请及时绑定邮箱和手机立即绑定

Java 8减去日期但保留小时

Java 8减去日期但保留小时

慕娘9325324 2021-09-15 15:53:56
我想从现在减去 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 收到了
查看完整描述

3 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

正如其他人的建议,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 兼容。)


查看完整回答
反对 回复 2021-09-15
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

从到目前为止发布的其他答案中的代码中不清楚他们如何处理夏令时 (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.066957Z

A week ago in Spain: 2018-09-06T09:46:58.102680Z

我相信你会根据你的代码调整这个想法。


查看完整回答
反对 回复 2021-09-15
?
BIG阳

TA贡献1859条经验 获得超6个赞

使用类LocalDateTime代替LocalDate(不包含时间组件..)


查看完整回答
反对 回复 2021-09-15
  • 3 回答
  • 0 关注
  • 180 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信