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

使用System.Text.Json反序列化UTC/Zulu格式时间字符串的问题

解决System.Text.Json反序列化Zulu格式时间的问题

首先明确:你提到的小数点后到Z之前的数字是小数秒(这里精确到7位,即100纳秒级别),不是UTC偏移量,末尾的Z才是UTC时区的标记(等同于+00:00)。

方案一:无需自定义转换器,直接用内置支持

System.Text.Json默认支持这种标准ISO 8601格式的Zulu时间,可能你之前的自定义转换器反而导致了冲突。按以下步骤处理:

  1. 定义匹配的实体类:
public class TimeResponse
{
    [JsonPropertyName(".issued")]
    public DateTimeOffset Issued { get; set; }

    [JsonPropertyName(".expires")]
    public DateTimeOffset Expires { get; set; }
}
  1. 反序列化时配置正确的选项:
var json = "{\"issued\":\"2023-03-01T13:26:35.1134406Z\",\"expires\":\"2023-03-01T21:26:35.1134406Z\"}";

var options = new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true, // 可选,避免大小写匹配问题
    DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};

var result = JsonSerializer.Deserialize<TimeResponse>(json, options);

方案二:自定义转换器(特殊场景需求)

如果确实需要自定义转换器处理,确保格式字符串正确匹配小数秒部分:

  1. 实现正确的转换器:
public class DateTimeOffsetZuluConverter : JsonConverter<DateTimeOffset>
{
    // 匹配7位小数秒的Zulu格式
    private const string ZuluFormat = "yyyy-MM-dd'T'HH:mm:ss.FFFFFFF'Z'";

    public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var dateString = reader.GetString();
        // 优先按指定格式解析
        if (DateTimeOffset.TryParseExact(dateString, ZuluFormat, CultureInfo.InvariantCulture, 
            DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var dateOffset))
        {
            return dateOffset;
        }
        // fallback到内置解析,兼容格式细微变化
        return DateTimeOffset.Parse(dateString, CultureInfo.InvariantCulture, 
            DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);
    }

    public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString(ZuluFormat, CultureInfo.InvariantCulture));
    }
}
  1. 使用转换器反序列化:
var options = new JsonSerializerOptions();
options.Converters.Add(new DateTimeOffsetZuluConverter());

var result = JsonSerializer.Deserialize<TimeResponse>(json, options);

关键注意点

  • 格式字符串中FFFFFFF对应最多7位小数秒,和接口返回的格式完全匹配;
  • 解析时指定DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,确保将Z标记的时间正确解析为UTC时间。

内容的提问来源于stack exchange,提问作者Ducky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:03:28