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
相关产品推荐
相关产品推荐

