如何修改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
相关产品推荐
相关产品推荐

