ISO日期无法转换为12小时制时间问题求助(附Java代码)
问题排查与修复方案
首先,你的代码无法生成12小时制时间的核心原因是格式符使用错误:在输出格式"dd-MM HH:mm a"中,HH代表的是24小时制的小时(00-23),而12小时制的小时需要用hh(01-12)来表示——这就是转换失败的关键问题。
修正后的代码
private String getFormattedDate(String date){ try { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); formatter.setTimeZone(TimeZone.getTimeZone("UTC")); Date value = formatter.parse(date); // 将HH替换为hh,对应12小时制小时格式 SimpleDateFormat dateFormatter = new SimpleDateFormat("dd-MM hh:mm a"); dateFormatter.setTimeZone(TimeZone.getDefault()); date = dateFormatter.format(value); } catch (Exception e) { date = "00-00 00:00"; // 这里统一了错误返回格式,和目标输出格式保持一致 } return date; }
关键细节解释
HH:对应24小时制小时(取值00-23),比如下午3点会显示为15hh:对应12小时制小时(取值01-12),配合a标识可以区分上午/下午a:自动根据时间显示时段标识(中文环境显示“上午”/“下午”,英文环境显示AM/PM)
额外优化建议(Java 8+)
SimpleDateFormat存在线程不安全的问题,且已被Java 8引入的java.time日期API取代,推荐使用更安全、逻辑更清晰的API实现:
private String getFormattedDate(String date){ try { // 解析UTC时区的ISO格式时间 Instant instant = Instant.parse(date); // 转换为系统默认时区的时间 ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault()); // 格式化为12小时制字符串 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM hh:mm a"); return zonedDateTime.format(formatter); } catch (Exception e) { return "00-00 00:00"; } }
内容的提问来源于stack exchange,提问作者Mrugesh
相关产品推荐
相关产品推荐

