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

Java如何将带偏移量的日期字符串转换为应用偏移后的Date对象

解决日期字符串解析与时区偏移问题

嘿,我来帮你搞定这个问题!你遇到的核心问题是没有在日期格式中包含时区偏移部分,导致SimpleDateFormat直接忽略了字符串里的-0700,用JVM默认时区解析,自然得不到预期的结果。

为什么你的代码不对?

你用的格式"yyyy-MM-dd'T'HH:mm:ss"只覆盖了日期和时分秒,完全没处理字符串末尾的.0000000-0700(7位毫秒+时区偏移)。解析时JVM会忽略这部分内容,直接把2018-04-12T21:25:28当成本地时间处理,所以得到了9:25 PM的结果。

解决方案1:修复SimpleDateFormat的使用

如果一定要用旧的SimpleDateFormat,你需要修改格式模式,把毫秒和时区偏移都包含进去:

String dateString = "2018-04-12T21:25:28.0000000-0700";
// SSSSSSS 对应7位毫秒,Z 对应RFC 822格式的时区偏移(比如-0700)
SimpleDateFormat parserSdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ");
// 解析时会自动应用时区偏移,得到的Date对象对应UTC时间
Date date = parserSdf.parse(dateString);

// 如果你要输出成预期的格式,需要指定目标时区
SimpleDateFormat outputSdf = new SimpleDateFormat("dd/MM/yyyy h:mm:ss a");
// 这里假设你需要转换到UTC+10时区(比如澳大利亚东部时间),可根据需求调整
outputSdf.setTimeZone(TimeZone.getTimeZone("UTC+10"));
String formattedDate = outputSdf.format(date);
System.out.println(formattedDate); // 输出 13/04/2018 2:25:28 PM

注:你预期的12/04/2018 2:25:28 PM对应的时区需要再确认——原时间2018-04-12T21:25:28-0700转换为UTC是2018-04-13T04:25:28,只有当目标时区是UTC-2时,才会是12号的下午2点25,但这个时区比较少见,可能是你表述时的小失误~

解决方案2:使用Java 8+的java.time API(强烈推荐)

SimpleDateFormat是线程不安全的,而且属于Java旧日期API,Java 8及以后更推荐使用java.time包(JSR-310标准),它设计更合理,功能更强大:

String dateString = "2018-04-12T21:25:28.0000000-0700";
// 定义解析格式,匹配日期字符串的结构
DateTimeFormatter parserFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ");
// 解析为带时区的日期时间对象
ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateString, parserFormatter);

// 转换为UTC时间(可选,根据需求调整)
Instant utcInstant = zonedDateTime.toInstant();

// 转换到目标时区并格式化输出,比如澳大利亚悉尼时区
ZonedDateTime targetZoned = utcInstant.atZone(ZoneId.of("Australia/Sydney"));
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy h:mm:ss a");
String formattedDate = targetZoned.format(outputFormatter);
System.out.println(formattedDate); // 输出 13/04/2018 2:25:28 PM

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:11:19