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
相关产品推荐
相关产品推荐

