Java中如何设置当日结束时间?程序输出endDate异常求助
问题分析与解决方案
首先,你的代码存在两个核心问题导致endDate不符合预期:
- 未将Calendar定位到目标日期2018-03-28:当前
Calendar cal = Calendar.getInstance();获取的是系统当前时间,而非你需要的2018年3月28日,后续的格式化和解析都是基于当前时间处理的,完全偏离了需求。 - 冗余的格式化+解析操作易引入误差:先把Date格式化再解析回Date的做法毫无必要,直接操作Calendar的时间字段来设置起止时间更可靠。
你提到endDate输出为2018/03/28 00:00:00,大概率是测试时当前日期并非2018-03-28,或是时区偏移导致解析时出现时间回滚(比如部分时区的偏移会让23:59:59被解析为次日00:00:00)。
修复方案(传统API)
直接通过Calendar设置目标日期的起止时间,避免多余的格式化解析步骤:
// 1. 初始化Calendar并定位到2018-03-28 00:00:00 Calendar cal = Calendar.getInstance(); cal.set(2018, Calendar.MARCH, 28, 0, 0, 0); cal.set(Calendar.MILLISECOND, 0); // 确保毫秒位为0 Date startDate = cal.getTime(); // 2. 修改Calendar为当天23:59:59.999 cal.set(Calendar.HOUR_OF_DAY, 23); cal.set(Calendar.MINUTE, 59); cal.set(Calendar.SECOND, 59); cal.set(Calendar.MILLISECOND, 999); // 设置毫秒为999,避免遗漏毫秒级数据 Date endDate = cal.getTime(); // 验证输出 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS"); System.out.println("startDate: " + sdf.format(startDate)); System.out.println("endDate: " + sdf.format(endDate));
代码说明:
Calendar.MARCH对应3月(Calendar的月份从0开始计数,0=1月,2=3月)- 设置
MILLISECOND为999是为了覆盖当天最后一毫秒的时间,避免像2018-03-28 23:59:59.123这类时间被排除在查询范围外。
推荐方案(Java 8+ 新时间API)
传统的Date和Calendar类存在线程不安全、API设计反直觉等问题,Java 8及以上强烈推荐使用java.time包下的新时间API:
import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Date; // 设置目标日期的起止时间 LocalDateTime startLocal = LocalDateTime.of(2018, 3, 28, 0, 0, 0, 0); LocalDateTime endLocal = LocalDateTime.of(2018, 3, 28, 23, 59, 59, 999_999_999); // 支持纳秒级精度 // 转换为Date对象(适配旧代码场景) Date startDate = Date.from(startLocal.atZone(ZoneId.systemDefault()).toInstant()); Date endDate = Date.from(endLocal.atZone(ZoneId.systemDefault()).toInstant()); // 验证输出 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS"); System.out.println("startDate: " + sdf.format(startDate)); System.out.println("endDate: " + sdf.format(endDate));
优势:
- 线程安全,API设计清晰直观,不易出错
- 支持纳秒级精度,时间操作更灵活
- 避免了
Calendar中月份从0开始的反直觉设计
内容的提问来源于stack exchange,提问作者dsadffg
相关产品推荐
相关产品推荐

