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
我相信你會根據你的代碼調整這個想法。
添加回答
舉報