SimpleDateFormat解析时间字符串异常返回1970年日期该如何解决?
问题诱因
- 你输入的待解析字符串仅包含时分秒毫秒信息,未携带年月日字段,
SimpleDateFormat的默认解析逻辑会自动用UNIX纪元起始日期(1970年1月1日)补全缺失的日期部分,所以得到的Date对象日期为1970-01-01属于符合预期的默认行为,不属于解析异常。 - 你新增的
df2.format(currentdate)代码不会产生任何效果:format方法仅负责将Date对象转换为格式化字符串,不会修改原Date对象的内部值,所以写入列表的仍然是解析得到的1970年日期对象。 setLenient(false)的作用是开启严格解析校验,仅会对格式不合法的输入(比如小时为25、分钟为61这类异常值)抛出异常,你的输入格式完全匹配模式串,所以该配置不会改变解析结果。
解决方案
根据你的使用场景可以选择以下处理方式:
- 如果你需要解析得到的时间对应指定日期(比如当前自然日的7点),可以将目标日期拼接到待解析字符串前,同时调整模式串匹配完整时间格式:
// 示例:补全为当前日期的对应时间 String current = "07:00:00.160"; String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); String fullTimeStr = today + " " + current; DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); DateList.add(df2.parse(fullTimeStr));
- 如果你仅需要存储时分秒信息,不需要日期字段,Java 8及以上版本推荐直接使用
java.time.LocalTime类,无需处理补全日期的逻辑,且不存在线程安全问题:
LocalTime time = LocalTime.parse("07:00:00.160"); // 后续直接使用LocalTime对象即可
- 如果你必须使用Date类且需要自定义日期,可通过Calendar类手动替换日期部分:
String current = "07:00:00.160"; DateFormat df2 = new SimpleDateFormat("HH:mm:ss.SSS"); Date timePart = df2.parse(current); Calendar calendar = Calendar.getInstance(); // 先设置为你需要的目标日期,示例为2024年5月20日 calendar.set(2024, Calendar.MAY, 20); // 覆盖时分秒毫秒为解析得到的值 calendar.set(Calendar.HOUR_OF_DAY, timePart.getHours()); calendar.set(Calendar.MINUTE, timePart.getMinutes()); calendar.set(Calendar.SECOND, timePart.getSeconds()); calendar.set(Calendar.MILLISECOND, (int) (timePart.getTime() % 1000)); Date targetDate = calendar.getTime(); DateList.add(targetDate);
内容的提问来源于stack exchange,提问作者Robertas Streikus
相关产品推荐
相关产品推荐

