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

Java使用hh:mm aa格式解析时间结果不符合预期问题

问题原因分析
  • 格式符使用错误:SimpleDateFormat中hh代表12小时制的小时,取值范围为112;如果需要解析24小时制的小时,应该使用格式符`HH`,取值范围为023。
  • 输入时间存在逻辑冲突:你输入的待解析内容是13:15 pm,13本身是24小时制的下午1点的表述,同时加上12小时制才需要的pm后缀,本身逻辑矛盾。
  • 宽松解析机制导致异常结果:SimpleDateFormat默认开启宽松解析,遇到不符合格式范围的输入不会直接抛出异常,而是会按照规则自动换算:首先解析到pm标识时,12小时制的解析逻辑会自动给小时数加12,你输入的小时部分是13,加12后得到25小时,25小时换算为1天零1小时,由于你只输入了时间没有指定日期,默认的基准日期是1970年1月1日,累加后日期就变成了1970年1月2日,时间为1点15分,最终得到你看到的Fri Jan 02 01:15:00 PST 1970输出。
修复方案
  • 场景1:需要解析带am/pm的12小时制时间
    把待解析的字符串修改为01:15 pm,格式保持hh:mm aa即可。如果需要按自己预期的格式输出结果,不要直接打印Date对象,应该用对应的SimpleDateFormat格式化后再输出:
    // 输出12小时制带am/pm格式
    System.out.println(new SimpleDateFormat("hh:mm:ss aa z").format(theDate));
    // 输出24小时制格式
    System.out.println(new SimpleDateFormat("HH:mm:ss z").format(theDate));
    
  • 场景2:需要解析24小时制时间
    去掉待解析字符串后的pm后缀,把格式修改为HH:mm即可:
    String TIME_FORMAT = "HH:mm";
    Date theDate = new SimpleDateFormat(TIME_FORMAT).parse("13:15");
    
  • 额外建议:如果要避免宽松解析导致的异常结果,可以手动关闭宽松解析,不符合格式的输入会直接抛出解析异常,方便问题排查:
    SimpleDateFormat sdf = new SimpleDateFormat(TIME_FORMAT);
    sdf.setLenient(false);
    Date theDate = sdf.parse("你的时间字符串");
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 20:42:01