使用DateTimeFormatter.ISO_ZONED_DATE_TIME解析带时区偏移的ZonedDateTime字符串报错求助
问题原因与解决方案
你遇到的DateTimeParseException其实很好理解——DateTimeFormatter.ISO_ZONED_DATE_TIME对时区偏移的格式有严格要求,而你的输入字符串刚好不符合它的预期规则。
具体来说,这个默认格式化器遵循严格的ISO 8601标准,它期望的时区偏移格式是带冒号的±HH:mm(比如+00:00)或者大写的Z;但你的输入里时区是+0000(不带冒号的±HHmm格式),解析器在索引19的位置(也就是+之后的部分)找不到预期的冒号,自然就抛出了异常。
解决方案一:自定义匹配格式的DateTimeFormatter
直接创建一个适配你输入格式的格式化器,就能完美解析+0000这种时区格式:
import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class DateTimeParseFix { public static void main(String[] args) { // 定义匹配"yyyy-MM-dd'T'HH:mm:ssZ"格式的格式化器 DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); ZonedDateTime date = ZonedDateTime.parse("2021-02-19T14:32:12+0000", customFormatter); System.out.println(date); // 输出:2021-02-19T14:32:12Z } }
解决方案二:调整输入字符串适配默认格式化器
如果你想继续使用ISO_ZONED_DATE_TIME,可以先修改输入字符串的时区部分,让它符合标准格式:
import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class DateTimeParseFix { public static void main(String[] args) { String input = "2021-02-19T14:32:12+0000"; // 方案A:给时区偏移加上冒号,适配ISO标准格式 String adjustedInput = input.replaceAll("([+-]\\d{2})(\\d{2})$", "$1:$2"); ZonedDateTime date = ZonedDateTime.parse(adjustedInput, DateTimeFormatter.ISO_ZONED_DATE_TIME); System.out.println(date); // 输出:2021-02-19T14:32:12Z // 方案B:直接替换成Z(因为+0000等价于UTC时区) String adjustedInput2 = input.replace("+0000", "Z"); ZonedDateTime date2 = ZonedDateTime.parse(adjustedInput2, DateTimeFormatter.ISO_ZONED_DATE_TIME); System.out.println(date2); // 输出:2021-02-19T14:32:12Z } }
简单总结:ISO_ZONED_DATE_TIME是严格遵循标准的格式化器,而不带冒号的±HHmm是一种常见的简化格式,要么自定义格式化器支持它,要么调整输入字符串适配标准格式就能解决问题。
内容的提问来源于stack exchange,提问作者MisterIbbs
相关产品推荐
相关产品推荐

