Java中使用SimpleDateFormat解析"12:00"为SQL Time返回负值问题
问题诱因
- 时间格式符使用错误:代码中使用的
hh是12小时制的小时格式符,取值范围为1~12,解析输入的12:00时会被识别为12小时制的午夜0点,而非正午12点。 - 时区偏移导致时间戳为负:SimpleDateFormat默认使用运行环境的时区解析时间,代码中指定了西班牙(
es-ES)区域,对应时区为UTC+1。由于输入的时间字符串没有携带年月日信息,SimpleDateFormat会默认补全为纪元起始时间1970-01-01,该日期的西班牙时区0点对应UTC时间为1969-12-31 23:00:00,对应的毫秒时间戳正好是-3600000。
修复方案
可根据项目Java版本选择对应修复方式:
方案1:兼容Java 8以前版本,修复SimpleDateFormat配置
- 将12小时制格式符
hh替换为24小时制格式符HH - 明确指定解析时区为UTC,消除时区偏移影响
- 区域改用
Locale.ROOT避免不同地区的格式适配问题
修复后代码:
public static Time isoStringToTime(String isoTimeString) { try { SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.ROOT); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); return new Time(sdf.parse(isoTimeString).getTime()); } catch (ParseException e) { throw new ApplicationException("Formato ISO incorrecto para fecha: " + isoTimeString); } }
方案2:Java 8及以上版本,使用线程安全的java.time新API
Java 8引入的java.time包解决了旧日期类的线程安全、格式歧义等问题,更推荐使用:
public static Time isoStringToTime(String isoTimeString) { try { LocalTime localTime = LocalTime.parse(isoTimeString, DateTimeFormatter.ofPattern("HH:mm")); return Time.valueOf(localTime); } catch (DateTimeParseException e) { throw new ApplicationException("Formato ISO incorrecto para fecha: " + isoTimeString); } }
内容的提问来源于stack exchange,提问作者diegogs_
相关产品推荐
相关产品推荐

