c# mvc/webpai全局设置时间格式都返回时间戳


这里用Newtonsoft举例

1、nuget添加引用

Newtonsoft.Json

Microsoft.AspNetCore.Mvc.NewtonsoftJson

2、.net5及以下在Startup.net6在Program在AddControllers后添加AddNewtonsoftJson

.net5:

services.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.UnixDateTimeConverter());
});

.net6:
builder.Services.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.UnixDateTimeConverter());
});

运行

 

 

 

这样所有的时间格式在返回前端都会变成时间戳,不过这里的时间戳的精度是秒,10位,假如需要毫秒的话需要自定义一个CustomUnixDateTimeConverter
我们可以参考UnixDateTimeConverter的实现

 

 

 

看了UnixDateTimeConverter的源码发现他用的单位是秒,我们只需要将秒改为毫秒就行了

以下是改造后的代码,异常我只是简单的处理了一下有需要的可以自己处理

namespace Newtonsoft.Json.Converters
{
public class CustomUnixDateTimeConverter : DateTimeConverterBase
{
internal static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{
long num;
if (value is DateTime)
{
num = (long)(((DateTime)value).ToUniversalTime() - UnixEpoch).TotalMilliseconds;
}
else
{
if (!(value is DateTimeOffset))
{
throw new JsonSerializationException("Expected date object value.");
}

num = (long)(((DateTimeOffset)value).ToUniversalTime() - UnixEpoch).TotalMilliseconds;
}

if (num < 0)
{
throw new JsonSerializationException("Cannot convert date value that is before Unix epoch of 00:00:00 UTC on 1 January 1970.");
}

writer.WriteValue(num);
}

public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
{
bool flag = IsNullable(objectType);
if (reader.TokenType == JsonToken.Null)
{
if (!flag)
{
throw new Exception("Cannot convert null value to {0}.");
}

return null;
}

long result;
if (reader.TokenType == JsonToken.Integer)
{
result = (long)reader.Value;
}
else
{
if (reader.TokenType != JsonToken.String)
{
throw new Exception( "Unexpected token parsing date. Expected Integer or String, got.");
}

if (!long.TryParse((string)reader.Value, out result))
{
throw new Exception ( "Cannot convert invalid value to.");
}
}

if (result >= 0)
{
DateTime unixEpoch = UnixEpoch;
DateTime dateTime = unixEpoch.AddMilliseconds(result);
if ((flag ? Nullable.GetUnderlyingType(objectType) : objectType) == typeof(DateTimeOffset))
{
return new DateTimeOffset(dateTime, TimeSpan.Zero);
}
return dateTime;
}
throw new Exception("Cannot convert value that is before Unix epoch of 00:00:00 UTC on 1 January 1970 to.");
}
private static bool IsNullable(Type t)
{
if (t.IsValueType)
{
return IsNullableType(t);
}

return true;
}

private static bool IsNullableType(Type t)
{
if (t.IsGenericType)
{
return t.GetGenericTypeDefinition() == typeof(Nullable<>);
}
return false;
}
}
}

将之前的UnixDateTimeConverter换成换成CustomUnixDateTimeConverter运行

 

 

ok,时间戳精度到毫秒了

posted @ 2022-03-31 20:33  苏仙一  阅读(537)  评论(0)    收藏  举报