如何用单一格式解析API响应中两种不同格式的日期?
用单一格式解析两种带时区后缀的日期字符串
问题场景
从API返回的日期存在两种格式:
- 格式1:
"date": "2022-10-13T00:00:00+02:00[Africa/Johannesburg]"
- 格式2:
"date": "2022-10-02T13:55:50.283+05:30[+05:30]"
核心差异在于方括号内的内容:一个是时区ID,一个是重复的时区偏移量;同时格式1无毫秒部分,格式2包含毫秒。
解决方案
两种格式的核心有效信息(日期时间+时区偏移)完全一致,方括号内的内容属于冗余附加信息,可通过以下两种方式实现单一格式解析:
方式1:预处理字符串,移除冗余方括号部分
先用正则或字符串切割去掉[到]的所有内容,再用通用格式解析处理后的字符串。
Java示例
import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class DateParser { public static void main(String[] args) { // 定义支持可选毫秒的通用解析格式 DateTimeFormatter coreFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSS]XXX"); String dateStr1 = "2022-10-13T00:00:00+02:00[Africa/Johannesburg]"; String dateStr2 = "2022-10-02T13:55:50.283+05:30[+05:30]"; // 移除方括号及内部内容 String cleanedStr1 = dateStr1.replaceAll("\\[.*\\]", ""); String cleanedStr2 = dateStr2.replaceAll("\\[.*\\]", ""); // 解析得到时区日期对象 ZonedDateTime result1 = ZonedDateTime.parse(cleanedStr1, coreFormatter); ZonedDateTime result2 = ZonedDateTime.parse(cleanedStr2, coreFormatter); System.out.println(result1); System.out.println(result2); } }
Python示例
import datetime def parse_date(date_str): # 切割并保留方括号前的核心内容 cleaned_str = date_str.split('[')[0] # 自动适配有无毫秒的ISO格式 return datetime.datetime.fromisoformat(cleaned_str) date1 = "2022-10-13T00:00:00+02:00[Africa/Johannesburg]" date2 = "2022-10-02T13:55:50.283+05:30[+05:30]" print(parse_date(date1)) print(parse_date(date2))
方式2:构建支持可选后缀的格式化器
直接构建包含可选方括号部分的格式化器,无需预处理原始字符串,让格式化器自动匹配两种格式。
Java示例
import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.temporal.ChronoField; public class DateParser { public static void main(String[] args) { DateTimeFormatter formatter = new DateTimeFormatterBuilder() // 日期时间核心部分 .appendPattern("yyyy-MM-dd'T'HH:mm:ss") // 可选的0-3位毫秒 .optionalStart() .appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true) .optionalEnd() // 时区偏移 .appendPattern("XXX") // 可选的方括号后缀:匹配任意内容直到闭合括号 .optionalStart() .appendLiteral('[') .appendPattern("[^\\]]*") .appendLiteral(']') .optionalEnd() .toFormatter(); // 直接解析原始字符串 String dateStr1 = "2022-10-13T00:00:00+02:00[Africa/Johannesburg]"; String dateStr2 = "2022-10-02T13:55:50.283+05:30[+05:30]"; ZonedDateTime result1 = ZonedDateTime.parse(dateStr1, formatter); ZonedDateTime result2 = ZonedDateTime.parse(dateStr2, formatter); System.out.println(result1); System.out.println(result2); } }
内容的提问来源于stack exchange,提问作者aj0822ArpitJoshi
相关产品推荐
相关产品推荐

