自定义Asp.net Core中向前台传递时间的格式


记录一下如何在Asp.net Core项目中自定义返回给前台的时间格式,如果不做设置返回前台的时间将会带一个

​T​​,使用一下格式可以自定义传回前台为

​YYYY-MM-dd​​或

​YYYY-mm-dd HH:mm:ss​

环境

Visual studio 2022, .Net 6.0

代码

using System.Text.Json;
using System.Text.Json.Serialization;

namespace ApiProj.utilities
{
public class DateConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
if (DateTime.TryParse(reader.GetString(), out DateTime date))
return date;
}
return reader.GetDateTime();
}

public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-dd"));
}
}
public class DateTimeConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
if (DateTime.TryParse(reader.GetString(), out DateTime date))
return date;
}
return reader.GetDateTime();
}

public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss"));
}
}

public class MillisecondTimeConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
if (DateTime.TryParse(reader.GetString(), out DateTime date))
return date;
}
return reader.GetDateTime();
}

public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss.fff"));
}
}

public class DateTimeNullableConverter : JsonConverter<DateTime?>
{
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
if (DateTime.TryParse(reader.GetString(), out DateTime date)) return date;
return default(DateTime?);

}
return reader.GetDateTime();
}

public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
{
writer.WriteStringValue(value?.ToString("yyyy-MM-dd HH:mm:ss"));
}
}

public class DateNullableConverter : JsonConverter<DateTime?>
{
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
if (DateTime.TryParse(reader.GetString(), out DateTime date)) return date;
return default(DateTime?);

}
return reader.GetDateTime();
}

public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
{
writer.WriteStringValue(value?.ToString("yyyy-MM-dd"));
}
}

}

其中包含两种转换的方式,一种为​​DateTime​​​另一种为​​DateTime?​​,使用时需要注意DateTime是否会为空.

注册服务

在​​Program.cs中​​添加

builder.Services.AddControllersWithViews().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
options.JsonSerializerOptions.Converters.Add(new DateTimeNullableConverter());
});

使用

在类中直接使用注解的形式

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
using ApiProj.utilities;
using Microsoft.EntityFrameworkCore;

namespace ApiProj.Model
{
[Table("User_info")]
public class UserInfo
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string account { get; set; }
public string name { get; set; }
public string password { get; set; }
public int phone { get; set; }
public string sex { get; set; }
[Column("create_time")]
[DataType(DataType.Date)]
[JsonConverter(typeof(DateNullableConverter))]
public DateTime? createTime { get; set; }


}
}