Java 8如何解析包含阿拉伯-印度数字的日期时间及时区字符串
问题根因
你遇到的解析报错是因为java.time.DateTimeFormatter的内置偏移量格式规则(对应你代码里的XXX模式)默认仅支持ASCII数字解析,不会继承你通过withDecimalStyle配置的阿拉伯-印度数字规则。报错位置索引19刚好是时区偏移量的第一个数字位,因此时区部分用ASCII数字时可以正常解析,用阿拉伯-印度数字时就会抛出异常。
解决方案
推荐直接对输入字符串做数字转写预处理,将阿拉伯-印度数字统一转换为ASCII数字后再解析,实现成本最低,兼容性最好:
// 阿拉伯-印度数字转ASCII数字工具方法 private static String arabicIndicToAsciiDigits(String input) { StringBuilder result = new StringBuilder(input.length()); for (char c : input.toCharArray()) { // 判断是否为阿拉伯-印度数字区间 if (c >= '\u0660' && c <= '\u0669') { // 转换为对应ASCII数字 result.append((char) ('0' + (c - '\u0660'))); } else { result.append(c); } } return result.toString(); } // 解析逻辑 String dateTime = "٢٠٢١-١١-٠٨T٠٢:٢١:٠٨+٠٢:٠٠"; String converted = arabicIndicToAsciiDigits(dateTime); // 转写后符合ISO 8601格式,直接用内置实例解析即可 ZonedDateTime parsedDateTime = ZonedDateTime.parse(converted, DateTimeFormatter.ISO_ZONED_DATE_TIME);
如果不想做字符串预处理,也可以通过DateTimeFormatterBuilder自定义偏移量解析规则,手动实现阿拉伯-印度数字的偏移量识别,不过实现复杂度较高,没有特殊要求优先使用预处理方案即可。
内容的提问来源于stack exchange,提问作者Daria Pydorenko
相关产品推荐
相关产品推荐

