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

Java中带时区日期字符串转UTC格式解析失败求助

解决Java日期解析失败并转换为UTC格式的问题

咱们先拆解下你遇到的问题根源:你的输入日期字符串格式和定义的INPUT_FORMAT完全不匹配,而且误用了LocalDateTime来解析带时区信息的日期,这才导致了解析异常。

错误原因分析

你的输入日期是2023-01-09 23:56:59UTC-05:30,但你定义的INPUT_FORMAT是yyyy-MM-dd'T'HH:mm:ss:

  • 输入里日期和时间之间是空格,但格式里写的是'T',这直接导致解析到第10位(空格的位置)时失败,也就是你看到的index 10错误
  • 输入末尾带有时区偏移信息UTC-05:30,但你的格式完全没处理这部分,而且LocalDateTime本身不存储时区信息,不适合用来解析带时区的日期字符串

修正后的解决方案

下面是调整后的代码,我会逐行解释关键改动:

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

public class DateConversionExample {
    public static void main(String[] args) {
        String dateUTC = "2023-01-09 23:56:59UTC-05:30";
        // 修正输入格式:匹配输入的"日期 时间UTC偏移量"结构,'UTC'是固定字面量,用单引号包裹
        final String INPUT_FORMAT = "yyyy-MM-dd HH:mm:ss'UTC'XXX";
        // 输出格式:包含毫秒部分.SSS,末尾用Z表示UTC时区
        final String OUTPUT_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSX";

        // 1. 用OffsetDateTime解析带时区偏移的日期(输入是UTC+偏移量,用OffsetDateTime更合适)
        OffsetDateTime offsetDateTime = OffsetDateTime.parse(dateUTC, DateTimeFormatter.ofPattern(INPUT_FORMAT));

        // 2. 转换为UTC时区的OffsetDateTime
        OffsetDateTime utcDateTime = offsetDateTime.withOffsetSameInstant(java.time.ZoneOffset.UTC);

        // 3. 格式化为目标输出格式
        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(OUTPUT_FORMAT);
        System.out.println("转换后的UTC日期:" + outputFormatter.format(utcDateTime));
    }
}

关键改动说明

  1. 输入格式修正:yyyy-MM-dd HH:mm:ss'UTC'XXX
    • HH:mm:ss后面的'UTC'表示输入里的UTC是固定字符串,不需要解析为时区标识符
    • XXX用来匹配后面的时区偏移(比如-05:30)
  2. 使用OffsetDateTime:替代LocalDateTime,因为它能正确处理带时区偏移的日期,避免丢失时区信息
  3. 输出格式调整:添加.SSS来生成毫秒部分(对应你要的.000),X会在UTC时区时输出Z,正好符合目标格式2023-01-12T00:27:59.000Z

运行这段代码,输入2023-01-09 23:56:59UTC-05:30会输出2023-01-10T05:26:59.000Z,完全符合你的需求。

内容的提问来源于stack exchange,提问作者user3763183

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:30:57