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

如何修改Spring中SimpleDateFormat解析日期的默认时间为00:00

问题原因

SimpleDateFormat默认使用JVM当前的系统时区执行解析,时区偏移会导致解析得到的Date对象自带非零点的时间部分,就是你遇到的输出时间和预期不符的问题。

解决方案

方案1:调整SimpleDateFormat配置(兼容Java 8之前的旧版本)

明确给SimpleDateFormat设置时区,同时显式指定时间部分默认值为0,修改后代码如下:

this.mdbReading.y = new Date[reading.y.length];
SimpleDateFormat ydateFormat = new SimpleDateFormat("yyyy-MM-dd");
// 按需设置时区,如果期望输出是UTC时区的0点就设为UTC,要本地时区0点就设为对应本地时区
ydateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
// 显式设置时间部分全为0,兜底保证
Calendar cal = ydateFormat.getCalendar();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
ydateFormat.setCalendar(cal);

for (int i = 0; i < reading.y.length; i++) {    
    //System.out.println("i = " + i + " string is "+ reading.y[i]);                                   
    try {
        this.mdbReading.y[i] = ydateFormat.parse(reading.y[i]);
    } catch (Exception e) {
        //TODO: handle exception
        System.out.println("Exception in date parse "+ e);
        break;
    }
}

方案2:使用Java 8+ 新时间API(更推荐)

Java 8之后推出的java.time包解决了旧Date、SimpleDateFormat线程不安全、设计混乱的问题,原生支持日期解析后默认取当天0点:

// 若mdbReading.y可以改类型为LocalDateTime,直接用这个版本
this.mdbReading.y = new LocalDateTime[reading.y.length];
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
for (int i = 0; i < reading.y.length; i++) {    
    try {
        this.mdbReading.y[i] = LocalDate.parse(reading.y[i], dateFormatter).atStartOfDay();
    } catch (Exception e) {
        System.out.println("Exception in date parse "+ e);
        break;
    }
}

如果必须保留Date类型,补充一步转换即可:

Date date = Date.from(localDateTime.atZone(ZoneOffset.UTC).toInstant());

内容的提问来源于stack exchange,提问作者Deepak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:54:01