使用java.time将MM/dd/yyyy格式日期转换为带时区的ISO 8601格式
错误原因分析
- 解析格式不匹配:你定义的
DateTimeFormatter模式串为yyyy-MM-dd HH:mm:ss.S,但输入的数据库日期格式是月/日/年 时:分:秒.毫秒,结构完全不对应,所以触发解析失败,报错中提到的index 19就是字符串中毫秒位开始的位置,解析器在此处发现格式无法匹配。 - 输出逻辑错误:你最后调用
instant.toString()得到的是UTC时区的ISO格式字符串,和你需要的带UTC-4偏移的目标格式不符。
正确实现代码
import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class DateConvertUtil { // 数据库输入格式解析器 private static final DateTimeFormatter INPUT_FORMATTER = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss.S"); // 目标输出格式格式化器 private static final DateTimeFormatter OUTPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); // 目标时区(UTC-4) private static final ZoneId TARGET_ZONE = ZoneId.of("UTC-04:00"); public String convertDbDate(String dbDateStr) { // 1. 解析数据库日期字符串为无时区的LocalDateTime LocalDateTime ldt = LocalDateTime.parse(dbDateStr, INPUT_FORMATTER); // 2. 绑定目标时区得到带时区信息的ZonedDateTime ZonedDateTime zdt = ldt.atZone(TARGET_ZONE); // 3. 按目标格式输出字符串 return zdt.format(OUTPUT_FORMATTER); } // 测试验证 public static void main(String[] args) { DateConvertUtil util = new DateConvertUtil(); // 输入示例值,输出为 2021-06-25T10:26:33.000-04:00 System.out.println(util.convertDbDate("06/25/2021 10:26:33.0")); } }
逻辑说明
- 解析阶段:针对输入的
MM/dd/yyyy HH:mm:ss.S格式定义专用解析器,和数据库返回的日期字符串结构完全对齐,可正常解析1位毫秒的输入。 - 时区绑定:解析得到的
LocalDateTime本身不带时区信息,调用atZone方法绑定你需要的UTC-4时区,得到带偏移信息的ZonedDateTime对象。 - 格式化阶段:目标格式模式串中,
T是固定分隔符,SSS会自动将毫秒补全为3位,XXX会自动输出-04:00格式的时区偏移,完全匹配你需要的输出格式,返回的字符串可以直接用于JUnit断言比对。
内容的提问来源于stack exchange,提问作者Monnie_tester
相关产品推荐
相关产品推荐

