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

ASP.NET Core 2 Web API模型绑定:Unix时间戳转DateTime失败

解决ASP.NET Core 2 Web API中Unix时间戳转DateTime的模型绑定问题

我来帮你搞定这个Unix时间戳无法解析为DateTime的问题,咱们一步步来:

首先得提一个容易忽略的点:你的Model类里的属性没有public修饰符,ASP.NET Core的模型绑定只能作用于公共属性,所以第一步要修正Model:

public class Model { 
    public int id { get; set; } 
    public DateTime date { get; set; } 
}

接下来针对Unix时间戳的解析,ASP.NET Core 2默认使用Newtonsoft.Json进行JSON序列化/反序列化,我们可以通过自定义JsonConverter来实现Unix时间戳和DateTime的转换:

方案1:自定义JsonConverter(推荐)

创建一个专门处理Unix秒级时间戳的转换器:

public class UnixTimestampConverter : JsonConverter<DateTime>
{
    public override DateTime ReadJson(JsonReader reader, Type objectType, DateTime existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        // 检查输入是否为长整型时间戳
        if (reader.Value is long timestamp)
        {
            // 将Unix秒级时间戳转换为DateTime
            return DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        }
        
        throw new JsonSerializationException("输入的时间戳格式无效,请传入Unix秒级时间戳");
    }

    public override void WriteJson(JsonWriter writer, DateTime value, JsonSerializer serializer)
    {
        // 如果需要将DateTime序列化为Unix时间戳,可添加此逻辑
        var timestamp = new DateTimeOffset(value).ToUnixTimeSeconds();
        writer.WriteValue(timestamp);
    }
}

应用转换器的两种方式:

  • 属性级应用:只对特定属性生效,在Model的date属性上添加特性:
    public class Model { 
        public int id { get; set; } 
        [JsonConverter(typeof(UnixTimestampConverter))]
        public DateTime date { get; set; } 
    }
    
  • 全局应用:对所有DateTime属性生效,在Startup.cs的ConfigureServices方法中配置:
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
            .AddJsonOptions(options =>
            {
                options.SerializerSettings.Converters.Add(new UnixTimestampConverter());
            });
    }
    

方案2:自定义模型绑定器(备选)

如果你不想修改Json序列化配置,也可以自定义模型绑定器来处理date属性的绑定:

public class UnixTimestampModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (valueProviderResult == ValueProviderResult.None)
        {
            return Task.CompletedTask;
        }

        bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);

        var value = valueProviderResult.FirstValue;
        if (!long.TryParse(value, out var timestamp))
        {
            bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, "时间戳格式无效");
            return Task.CompletedTask;
        }

        var dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        bindingContext.Result = ModelBindingResult.Success(dateTime);
        return Task.CompletedTask;
    }
}

然后在Model的属性上绑定这个模型绑定器:

public class Model { 
    public int id { get; set; } 
    [ModelBinder(BinderType = typeof(UnixTimestampModelBinder))]
    public DateTime date { get; set; } 
}

不过相比之下,自定义JsonConverter的方式更简洁,也更符合JSON序列化的处理逻辑,更推荐使用第一种方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:27:10