128 lines
4.0 KiB
C#
128 lines
4.0 KiB
C#
using Newtonsoft.Json.Converters;
|
|
using Newtonsoft.Json;
|
|
using System;
|
|
using SharpCompress.Writers;
|
|
using IRaCIS.Core.Domain.Share;
|
|
using System.Globalization;
|
|
|
|
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!;
|
|
}
|
|
|
|
public static string DateTimeInternationalToString(DateTime? dateTime, string? clientZoneId = null)
|
|
{
|
|
var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
|
|
|
|
if (dateTime.HasValue)
|
|
{
|
|
|
|
var needDealTime = dateTime.Value;
|
|
|
|
if (!string.IsNullOrWhiteSpace(clientZoneId))
|
|
{
|
|
needDealTime = TimeZoneInfo.ConvertTime(needDealTime, TimeZoneInfo.Local, TimeZoneInfo.FindSystemTimeZoneById(clientZoneId));
|
|
}
|
|
|
|
if (needDealTime.Hour == 0 && needDealTime.Minute == 0 && needDealTime.Second == 0)
|
|
{
|
|
return needDealTime.ToString("yyyy-MM-dd");
|
|
}
|
|
else
|
|
{
|
|
if (isEn_US)
|
|
{
|
|
//暂时保持一致,等需求确认,修改英文要展示的日期格式
|
|
return needDealTime.ToString("yyyy-MM-dd HH:mm:ss");
|
|
}
|
|
else
|
|
{
|
|
return needDealTime.ToString("yyyy-MM-dd HH:mm:ss");
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
return string.Empty;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|