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

ASP.NET Core Web API中DateTime无法解析特定UTC时间格式问题

解决ASP.NET Core Web API解析非标准DateTime格式JSON的问题

在ASP.NET Core Web API项目接收Java API的Webhook请求时,JSON中time、insertTime字段的格式为"2023-03-01T11:12:00+0000",无法被默认的System.Text.Json解析为DateTime?类型,触发转换错误。

核心原因

System.Text.Json默认仅严格遵循ISO 8601标准格式(时区偏移需带冒号,如+00:00),而Java API返回的+0000属于非标准格式,因此解析失败。


解决方案

方法一:为DateTime字段添加自定义Json转换器

自定义支持目标格式的转换器,标注在对应字段上:

  1. 编写自定义转换器类
public class CustomDateTimeConverter : JsonConverter<DateTime?>
{
    private const string TargetFormat = "yyyy-MM-dd'T'HH:mm:sszzzz";

    public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.String && 
            DateTime.TryParseExact(reader.GetString(), TargetFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result))
        {
            return result;
        }
        return null;
    }

    public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value?.ToString(TargetFormat, CultureInfo.InvariantCulture));
    }
}
  1. 修改实体类字段,添加转换器特性
public class Data
{
    // 其他字段保持不变...

    [JsonPropertyName("time")]
    [JsonConverter(typeof(CustomDateTimeConverter))]
    public DateTime? time { get; set; }

    [JsonPropertyName("insertTime")]
    [JsonConverter(typeof(CustomDateTimeConverter))]
    public DateTime? insertTime { get; set; }

    // 其他字段保持不变...
}

方法二:全局配置Json序列化选项

如果希望整个API都支持该格式,在Program.cs中全局配置:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new CustomDateTimeConverter());
    });

// 其他项目配置...

var app = builder.Build();
// 中间件配置...
app.Run();

方法三:替换为Newtonsoft.Json(Json.NET)

Json.NET默认支持更多DateTime格式,包括不带冒号的时区偏移:

  1. 安装NuGet包:Microsoft.AspNetCore.Mvc.NewtonsoftJson
  2. 在Program.cs中配置使用Json.NET:
builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        // 可选:指定统一输出格式
        options.SerializerSettings.DateFormatString = "yyyy-MM-dd'T'HH:mm:sszzzz";
    });

替换后原实体类无需修改,即可直接解析目标JSON格式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:52:58