Java8删除日期,但保留小时
我想从现在开始减去7天,但保留时间,所以如果现在是 2018年9月12日18:30获得2018年9月5日18:30 我试过: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
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