Java8删除日期,但保留小时

Java8删除日期,但保留小时,java,datetime,java-8,Java,Datetime,Java 8,我想从现在开始减去7天,但保留时间,所以如果现在是 2018年9月12日18:30获得2018年9月5日18:30 我试过: public static Date subtractDays (int numDaysToSubstract) { LocalDate now = LocalDate.now().minusDays(numDaysToSubstract); return Date.from(now.atStartOfDay(ZoneId.systemD

我想从现在开始减去7天,但保留时间,所以如果现在是 2018年9月12日18:30获得2018年9月5日18:30

我试过:

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

但是我在2018年9月5日00:00时得到了使用class
LocalDateTime
而不是
LocalDate
(它不包含时间组件)

你应该使用
LocalDateTime
而不是
LocalDate

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

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

正如其他人所建议的那样,
LocalDate
atStartOfDay
应该仅仅基于他们的名字而成为危险信号。它们是描述时间的错误类型和维持时间的错误方法

通过
LocalDateTime
将其转换为
即时
也是毫无意义的。直接使用
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兼容。)

从其他答案中的代码中不清楚它们如何处理夏季(DST)和其他时间异常。他们的做法不同。为了更清楚地说明,如果现在的时间是18.30,那么您上周想要18.30,无论在此期间是否发生了夏季时间的转换,我建议使用
ZoneDateTime

    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
打印的时间):


我相信您会根据您的代码调整此想法。

为什么
LocalDate
?为什么
在StartofDay
?感谢您的贡献。只有代码的答案并没有真正的帮助。我们是来理解的,所以如果你能在你的回答中添加一些解释的话?比如你的代码是如何工作的,它是如何解决询问者的问题的。
    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);
Now:                 2018-09-13T09:46:58.066957Z
A week ago in Spain: 2018-09-06T09:46:58.102680Z