JDK8中LocalDateTime用hh格式解析报错,改用HH正常的原因咨询
为什么用12小时制格式"dd/MM/yyyy hh:mm"格式化LocalDateTime后,解析会抛出DateTimeParseException?
核心原因是12小时制的hh格式必须配合AM/PM时段标记才能完成解析:
hh代表12小时制的小时(取值范围1-12),它本身无法区分时间是上午还是下午。你用这个格式格式化时,LocalDateTime只会输出小时和分钟(比如03/03/2023 01:56),但不会自动添加AM/PM标识。- 当你用同一个格式器解析这个字符串时,DateTimeFormatter因为缺少关键的时段信息,无法判断
01:56是凌晨1点还是下午1点,因此直接抛出DateTimeParseException。
而HH是24小时制的小时格式(取值范围0-23),它不需要AM/PM标记就能唯一确定时间点,所以格式化和解析流程都能正常执行。
如果非要使用12小时制格式,有两个可行的解决方式:
- 在格式中加入AM/PM标记:把格式字符串改为
"dd/MM/yyyy hh:mm a",这样格式化后的字符串会带上上午/下午(或英文AM/PM,取决于默认Locale),解析时就能识别时段信息。 - 解析时指定默认时段:通过
DateTimeFormatterBuilder为解析器设置默认的AM/PM规则,比如默认按上午处理:
DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendPattern("dd/MM/yyyy hh:mm") .parseDefaulting(ChronoField.AMPM_OF_DAY, 0) // 0=上午(AM),1=下午(PM) .toFormatter(); LocalDateTime parsedTime = LocalDateTime.parse("03/03/2023 01:56", formatter);
内容的提问来源于stack exchange,提问作者Bryan PRADILLON
相关产品推荐
相关产品推荐

