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
相关产品推荐
相关产品推荐

