我想从现在减去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
答案 0 :(得分: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)));
}
(由于与某些旧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..