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

Java中使用SimpleDateFormat解析"12:00"为SQL Time返回负值问题

问题诱因
  1. 时间格式符使用错误:代码中使用的hh是12小时制的小时格式符,取值范围为1~12,解析输入的12:00时会被识别为12小时制的午夜0点,而非正午12点。
  2. 时区偏移导致时间戳为负: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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:54:03