You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何设置当日结束时间?程序输出endDate异常求助

问题分析与解决方案

首先,你的代码存在两个核心问题导致endDate不符合预期:

  1. 未将Calendar定位到目标日期2018-03-28:当前Calendar cal = Calendar.getInstance();获取的是系统当前时间,而非你需要的2018年3月28日,后续的格式化和解析都是基于当前时间处理的,完全偏离了需求。
  2. 冗余的格式化+解析操作易引入误差:先把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:23:10