[服务器处理时区上线测试]
This commit is contained in:
@@ -1,69 +1,87 @@
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Converters;
|
||||
using StackExchange.Redis;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
|
||||
namespace IRaCIS.Core.API
|
||||
{
|
||||
/// <summary>
|
||||
/// 废弃,没用,不用这种处理方式
|
||||
/// </summary>
|
||||
public class JSONCustomDateConverter : DateTimeConverterBase
|
||||
{
|
||||
private TimeZoneInfo _timeZoneInfo;
|
||||
private string _dateFormat;
|
||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||
|
||||
private IUserInfo _userInfo;
|
||||
public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo, IUserInfo userInfo)
|
||||
private readonly string timeZoneId;
|
||||
|
||||
private readonly TimeZoneInfo _clientTimeZone;
|
||||
public JSONCustomDateConverter(IHttpContextAccessor httpContextAccessor)
|
||||
{
|
||||
_dateFormat = dateFormat;
|
||||
_timeZoneInfo = timeZoneInfo;
|
||||
_httpContextAccessor = httpContextAccessor;
|
||||
|
||||
//默认是UTC
|
||||
//var timeZoneId = "Etc/UTC";
|
||||
var timeZoneId = "Asia/Shanghai";
|
||||
|
||||
var timeZoneIdHeader = _httpContextAccessor?.HttpContext?.Request?.Headers["TimeZoneId"];
|
||||
|
||||
if (timeZoneIdHeader is not null && !string.IsNullOrEmpty(timeZoneIdHeader.Value))
|
||||
{
|
||||
timeZoneId = timeZoneIdHeader.Value;
|
||||
}
|
||||
|
||||
_clientTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
|
||||
|
||||
_userInfo = userInfo;
|
||||
}
|
||||
|
||||
private static readonly TimeZoneInfo ChinaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Asia/Shanghai");
|
||||
private static readonly TimeZoneInfo ChinaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Etc/UTC");
|
||||
|
||||
public override bool CanConvert(Type objectType)
|
||||
{
|
||||
// 仅支持 DateTime 类型的转换
|
||||
return objectType == typeof(DateTime)|| objectType == typeof(DateTime?);
|
||||
}
|
||||
|
||||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
||||
{
|
||||
|
||||
|
||||
if (reader.ValueType == typeof(DateTime))
|
||||
{
|
||||
DateTime dateTime = (DateTime)reader.Value;
|
||||
|
||||
var zoneTime = TimeZoneInfo.ConvertTime(dateTime, ChinaTimeZone);
|
||||
|
||||
return zoneTime;
|
||||
}
|
||||
if (reader.Value == null)
|
||||
return null;
|
||||
else
|
||||
{
|
||||
return reader.Value;
|
||||
}
|
||||
var dateTime = (DateTime)reader.Value;
|
||||
|
||||
// 将客户端时间转换为服务器时区的时间
|
||||
var serverZoneTime = TimeZoneInfo.ConvertTime(dateTime, _clientTimeZone, TimeZoneInfo.Local);
|
||||
|
||||
return serverZoneTime;
|
||||
}
|
||||
|
||||
// 在反序列化时,我们不需要此转换器,因此不实现此方法
|
||||
//throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
||||
{
|
||||
var timeZoneId = _userInfo.TimeZoneId;
|
||||
|
||||
//var needConvertUtcDateTime = Convert.ToDateTime(value);
|
||||
|
||||
|
||||
|
||||
|
||||
//var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
|
||||
DateTime? nullableDateTime = value as DateTime?;
|
||||
|
||||
|
||||
//var dateTimeOffset = new DateTimeOffset(needConvertUtcDateTime);
|
||||
|
||||
//var time = TimeZoneInfo.ConvertTimeFromUtc(needConvertUtcDateTime, tz).ToString(_dateFormat);
|
||||
|
||||
//writer.WriteValue(time);
|
||||
//writer.Flush();
|
||||
|
||||
|
||||
if (value is DateTime dateTime)
|
||||
if (nullableDateTime != null && nullableDateTime.HasValue)
|
||||
{
|
||||
DateTime chinaTime = TimeZoneInfo.ConvertTime(dateTime, ChinaTimeZone);
|
||||
//第一个参数默认使用系统本地时区 也就是应用服务器的时区
|
||||
DateTime chinaTime = TimeZoneInfo.ConvertTime(nullableDateTime.Value, _clientTimeZone);
|
||||
writer.WriteValue(chinaTime);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
writer.WriteNull();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -10,7 +10,8 @@ namespace IRaCIS.Core.API
|
||||
{
|
||||
public static void AddNewtonsoftJsonSetup(this IMvcBuilder builder, IServiceCollection services)
|
||||
{
|
||||
services.AddScoped<DateTimeConverterBase, JSONCustomDateConverter>();
|
||||
services.AddHttpContextAccessor();
|
||||
services.AddScoped<JSONCustomDateConverter>();
|
||||
|
||||
builder.AddNewtonsoftJson(options =>
|
||||
{
|
||||
@@ -24,8 +25,10 @@ namespace IRaCIS.Core.API
|
||||
// 设置时间格式
|
||||
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
|
||||
|
||||
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;
|
||||
|
||||
//options.SerializerSettings.Converters.Add(new JSONCustomDateConverter()) ;
|
||||
//options.SerializerSettings.Converters.Add(services.BuildServiceProvider().GetService<JSONCustomDateConverter>());
|
||||
options.SerializerSettings.Converters.Add(services.BuildServiceProvider().GetService<JSONCustomDateConverter>());
|
||||
|
||||
//IsoDateTimeConverter
|
||||
//options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
|
||||
|
||||
Reference in New Issue
Block a user