使用DateTimeFormatter将多格式日期时间统一转为最长格式MM/dd/yyyy HH:mm:ss a
多格式DateTime统一转换解决方案
现有实现的问题
你的思路核心是对的,用可选模式段匹配多格式输入,但存在3个明显缺陷:
- 模式定义冲突:带上午/下午标识
a的格式串错误使用了24小时制HH,常规场景下a需要搭配12小时制hh使用,否则会出现解析异常(比如13:00搭配PM标识无法匹配)。如果你的输入确实是24小时制带a的特殊场景再调整回HH即可。 - 缺失默认值配置:仅用可选模式包裹的格式串,解析缺少时间部分的输入(比如
yyyyMMdd格式)时,LocalDateTime会因为缺少时分秒字段直接抛出异常,不会自动补0。 - 缺少输出格式化步骤:当前代码仅完成了字符串到
LocalDateTime的解析,没有按照要求把解析后的时间格式化为目标格式的字符串。
修复后的实现方案
我们用DateTimeFormatterBuilder配置缺失字段默认值,同时拆分解析、格式化两个步骤实现需求:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.temporal.ChronoField; // 1. 构建支持多格式的解析器,配置缺失字段默认补0 DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder() // 按匹配优先级从高到低添加可选模式 .appendPattern("[MM/dd/yyyy hh:mm:ss a]") .appendPattern("[MM/dd/yyyy HH:mm:ss]") .appendPattern("[MM/dd/yyyy HH:mm]") .appendPattern("[yyyyMMdd]") // 配置缺失时间字段默认值 .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0) .toFormatter(); // 2. 构建目标格式的输出格式化器 DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a"); // 3. 执行解析+格式化 String input = mm.getManufacturingDate().toString().trim(); // 去除首尾空格避免解析失败 LocalDateTime dateTime = LocalDateTime.parse(input, parseFormatter); String formattedDate = dateTime.format(outputFormatter); // 按实际需要的参数类型赋值即可:需要字符串传formattedDate,需要LocalDateTime传dateTime me.setManufacturingDate(formattedDate);
异常兼容优化
如果输入可能存在空值、完全不匹配的格式,可以加异常处理逻辑:
String formattedDate; try { String input = mm.getManufacturingDate().toString().trim(); LocalDateTime dateTime = LocalDateTime.parse(input, parseFormatter); formattedDate = dateTime.format(outputFormatter); } catch (Exception e) { // 自定义异常处理逻辑,比如设置默认时间或者抛出业务异常 formattedDate = "01/01/1970 12:00:00 AM"; } me.setManufacturingDate(formattedDate);
内容的提问来源于stack exchange,提问作者Rakesh Kumar
相关产品推荐
相关产品推荐

