You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:21:02