Java 8如何获取无时间成分的次日Date实例?
解决Java 8中获取次日0点Date实例的问题
嘿,这个需求我之前踩过类似的坑,给你两种适配Java 8环境的靠谱方案:
方案一:改进你原来的Calendar用法
你之前的代码只实现了“加一天”,但没对时间部分做清零操作,只需要在加完一天后,把时、分、秒、毫秒都设为0就行:
Calendar calendar = Calendar.getInstance(); // 先给当前日期加一天 calendar.add(Calendar.DAY_OF_YEAR, 1); // 清零时间部分:时、分、秒、毫秒全设为0 calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); // 得到时间全为0的次日Date Date tomorrow = calendar.getTime();
这里注意用Calendar.HOUR_OF_DAY(24小时制)而不是Calendar.HOUR(12小时制),避免出现上午/下午的混淆问题。
方案二:使用Java 8推荐的java.time新API
Java 8引入的java.time包彻底解决了旧日期API的各种坑(比如线程不安全、API设计混乱),用它来实现需求更简洁清晰:
// 1. 获取当前仅含年月日的LocalDate LocalDate today = LocalDate.now(); // 2. 直接加一天得到次日的LocalDate LocalDate tomorrowLocalDate = today.plusDays(1); // 3. 把LocalDate转为Date实例:指定时区,将日期转为当天0点的Instant再转Date Date tomorrow = Date.from( tomorrowLocalDate.atStartOfDay(ZoneId.systemDefault()) .toInstant() );
atStartOfDay()方法会自动把时间部分设为00:00:00,完全符合你的需求,而且代码逻辑一目了然。
如果你后续有更多日期处理需求,优先用java.time包的类(比如LocalDate、LocalDateTime、ZonedDateTime等),比旧的Date/Calendar好用太多啦!
内容的提问来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

