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)); } }
关键改动说明
- 输入格式修正:
yyyy-MM-dd HH:mm:ss'UTC'XXXHH:mm:ss后面的'UTC'表示输入里的UTC是固定字符串,不需要解析为时区标识符XXX用来匹配后面的时区偏移(比如-05:30)
- 使用OffsetDateTime:替代
LocalDateTime,因为它能正确处理带时区偏移的日期,避免丢失时区信息 - 输出格式调整:添加
.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
相关产品推荐
相关产品推荐

