Java 8减去日期但保留小时

时间:2018-09-12 16:01:10

标签: java datetime java-8

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

我尝试过:

public static Date subtractDays (int numDaysToSubstract) {
        LocalDate now = LocalDate.now().minusDays(numDaysToSubstract); 
        return Date.from(now.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

但是我05/05/2018 00:00

5 个答案:

答案 0 :(得分:3)

正如其他人所建议的那样,LocalDateatStartOfDay应该只是基于其名称的危险信号。它们是描述时间的错误类型,并且是维护时间的错误方法。

通过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)));

}

(由于与某些旧API兼容,我假设您正在使用java.util.Date。)

答案 1 :(得分:1)

到目前为止,从发布的其他答案中的代码尚不清楚,这些答案如何处理夏季时间(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

我相信您可以根据您的代码来调整想法。

答案 2 :(得分:0)

使用类LocalDateTime代替LocalDate(不包含时间成分。)

答案 3 :(得分:0)

您应该使用LocalDateTime而不是LocalDate

LocalDate只是对日期的描述,没有时间或时区

public static Date subtractDays (int numDaysToSubstract) {
    LocalDateTime now = LocalDateTime.now().minusDays(numDaysToSubstract); 
    return Date.from(now.atZone(ZoneId.systemDefault()).toInstant());
}

答案 4 :(得分:-1)

http://localhost:9966/myapp..