using System.Text.Json;
using System.Text.Json.Serialization;
namespace NDTInspHubCore.WebAPI.Converters
{
/// <summary>
/// UTC时间到本地时间的转换器
/// </summary>
public class UtcToLocalDateTimeConverter : JsonConverter<DateTime>
{
/// <summary>
/// 读取JSON并转换为UTC时间
/// </summary>
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTime.Parse(reader.GetString()!).ToUniversalTime();
}
/// <summary>
/// 将UTC时间转换为本地时间并写入JSON
/// </summary>
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
}
}
/// <summary>
/// UTC时间到本地时间的转换器(可空)
/// </summary>
public class UtcToLocalNullableDateTimeConverter : JsonConverter<DateTime?>
{
/// <summary>
/// 读取可空JSON并转换为UTC时间
/// </summary>
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.Null)
{
return null;
}
return DateTime.Parse(reader.GetString()!).ToUniversalTime();
}
/// <summary>
/// 将可空UTC时间转换为本地时间并写入JSON
/// </summary>
public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
{
if (value.HasValue)
{
writer.WriteStringValue(value.Value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
}
else
{
writer.WriteNullValue();
}
}
}
}
import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'
dayjs.extend(utc)
dayjs.extend(timezone)
export const formatUTCTime = (time) => {
return dayjs.utc(time).local().format('YYYY-MM-DD HH:mm:ss')
}
export const formatLocalTime = (time) => {
return dayjs(time).format('YYYY-MM-DD HH:mm:ss')
}
export const convertLocalToUTC = (time) => {
return dayjs(time).utc().format('YYYY-MM-DD HH:mm:ss')
}
program.cs
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.WriteIndented = false;
options.JsonSerializerOptions.Converters.Add(new UtcToLocalDateTimeConverter());
options.JsonSerializerOptions.Converters.Add(new UtcToLocalNullableDateTimeConverter());
});
/// <summary>
/// 配置映射关系
/// </summary>
public class AutoMapperConfig : Profile
{
/// <summary>
/// 配置映射关系
/// </summary>
public AutoMapperConfig()
{
// 全局时间转换:UTC到本地时间
CreateMap<DateTime, DateTime>().ConvertUsing(d => d.ToLocalTime());
CreateMap<DateTime?, DateTime?>().ConvertUsing(d => d.HasValue ? d.Value.ToLocalTime() : (DateTime?)null);
}
}
API 返回序列化 json 时处理,在.NET Core的JSON全局转换中,系统识别UTC时间的关键在于DateTime结构的Kind属性及数据传输的隐式约定