irc-netcore-api/IRaCIS.Core.Infrastructure/Extention/ExportExcelDateConverter.cs

86 lines
2.7 KiB
C#

using Newtonsoft.Json.Converters;
using Newtonsoft.Json;
using System;
using SharpCompress.Writers;
namespace IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson
{
public class ExportExcelDateConverter : DateTimeConverterBase
{
private readonly TimeZoneInfo _clientTimeZone;
public ExportExcelDateConverter(TimeZoneInfo clientTimeZone)
{
_clientTimeZone = clientTimeZone;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(DateTime) || objectType == typeof(DateTime?);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
DateTime? nullableDateTime = value as DateTime?;
if (nullableDateTime != null && nullableDateTime.HasValue)
{
// 将服务器时间转换为客户端时间
DateTime clientTime = TimeZoneInfo.ConvertTime(nullableDateTime.Value, TimeZoneInfo.Local, _clientTimeZone);
writer.WriteValue(clientTime);
}
else
{
writer.WriteNull();
}
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
DateTime? nullableDateTime = reader.Value as DateTime?;
if (nullableDateTime != null && nullableDateTime.HasValue)
{ // 服务器时区的时间转为客户端时间
var clientZoneTime = TimeZoneInfo.ConvertTime(nullableDateTime.Value, TimeZoneInfo.Local, _clientTimeZone);
return clientZoneTime;
}
return reader.Value;
}
}
public class ExportExcelConverterDate
{
public static T ConvertToClientTimeInObject<T>(T obj, string timeZoneId)
{
var clientTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
if (obj == null)
return obj;
// 将对象序列化为 JSON 字符串
string json = JsonConvert.SerializeObject(obj,new JsonSerializerSettings() { DateFormatString= "yyyy-MM-dd HH:mm:ss.fff" });
// 将 JSON 字符串反序列化回对象
var deserializedObj = JsonConvert.DeserializeObject<T>(json, new JsonSerializerSettings
{
Converters = { new ExportExcelDateConverter(clientTimeZone) },
DateFormatString = "yyyy-MM-dd HH:mm:ss.fff",
DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind
});
return deserializedObj!;
}
}
}