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

如何用单一格式解析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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:01:03