前言
这是记录ASP.NET core 中控制器传送JSON数据到前台时,日期格式的问题;
因为C # 中日期只有DateTime
类型,但是数据库中有Date
与DateTime
,转JSON时会发现Date的数据会在后面加上时分秒。比如
2021-06-22
传送到前台:
2021-06-22 00:00:00
工具类
为避免这种情况可以自定义一个工具类,如下:
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace SystemTextJsonConvert
{
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"));
}
}
}
针对c # 中DateTime类型与数据库中的日期类型分为 Date,DateTime,可为空的Date,可为空的DateTime
使用
创建实体类
public class Vaction
{
// 可为空的Date
[DataType(DataType.Date)]
[JsonConverter(typeof(DateNullableConverter))]
public DateTime? updateDate {get;set;}
// 可为空的DateTime
[DataType(DataType.Date)]
[JsonConverter(typeof(DateTimeNullableConverter))]
public DateTime? workDate{get;set;}
}
配置
要想在asp.net core中生效,需要在Startup.cs
中设置
// Json配置
services.AddControllersWithViews().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new SystemTextJsonConvert.DateTimeConverter());
options.JsonSerializerOptions.Converters.Add(new SystemTextJsonConvert.DateTimeNullableConverter());
});