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 obj, string timeZoneId) { var clientTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); if (obj == null) return obj; // 将对象序列化为 JSON 字符串 string json = JsonConvert.SerializeObject(obj); // 将 JSON 字符串反序列化回对象 var deserializedObj = JsonConvert.DeserializeObject(json, new JsonSerializerSettings { Converters = { new ExportExcelDateConverter(clientTimeZone) } }); return deserializedObj!; } } }