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 兼容。)
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
我相信你会根据你的代码调整这个想法。
添加回答
举报