1
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
using DOAN.Model.MES.Group.Dto;
|
using DOAN.Model.MES.Group.Dto;
|
||||||
using DOAN.Model.MES.order.Dto;
|
using DOAN.Model.MES.order.Dto;
|
||||||
using DOAN.Service.MES.Group.IService;
|
using DOAN.Service.MES.Group.IService;
|
||||||
|
using Infrastructure.Converter;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
namespace DOAN.Admin.WebApi.Controllers.MES.Group
|
namespace DOAN.Admin.WebApi.Controllers.MES.Group
|
||||||
{
|
{
|
||||||
@@ -19,7 +20,17 @@ namespace DOAN.Admin.WebApi.Controllers.MES.Group
|
|||||||
_achievementService = achievementService;
|
_achievementService = achievementService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost("test")]
|
||||||
|
[AllowAnonymous]
|
||||||
|
public IActionResult Test([FromBody] TestQuery parm)
|
||||||
|
{
|
||||||
|
parm.JobDatetime= parm.JobDatetime.ToLocalTime();
|
||||||
|
return SUCCESS(parm.JobDatetime);
|
||||||
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取y工绩效列表
|
/// 获取y工绩效列表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -28,6 +39,8 @@ namespace DOAN.Admin.WebApi.Controllers.MES.Group
|
|||||||
[HttpPost("get_staff_achievement_list")]
|
[HttpPost("get_staff_achievement_list")]
|
||||||
public IActionResult GetstaffAchievementList([FromBody]AchievementQueryDto parm)
|
public IActionResult GetstaffAchievementList([FromBody]AchievementQueryDto parm)
|
||||||
{
|
{
|
||||||
|
parm.JobDatetime[0]= DOANConvertDate.ConvertLocalDateTime(parm.JobDatetime[0]);
|
||||||
|
parm.JobDatetime[1]= DOANConvertDate.ConvertLocalDateTime(parm.JobDatetime[1]);
|
||||||
var response = _achievementService.GetstaffAchievementList(parm);
|
var response = _achievementService.GetstaffAchievementList(parm);
|
||||||
return SUCCESS(response);
|
return SUCCESS(response);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,10 @@ builder.Host.UseNLog();
|
|||||||
|
|
||||||
builder.Services.AddDynamicApi();
|
builder.Services.AddDynamicApi();
|
||||||
// Add services to the container.
|
// Add services to the container.
|
||||||
builder.Services.AddControllers();
|
builder.Services.AddControllers(options =>
|
||||||
|
{
|
||||||
|
options.ModelBinderProviders.Insert(0, new LocalDateModelBinderProvider());
|
||||||
|
});
|
||||||
|
|
||||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
|
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
|
||||||
builder.Services.AddEndpointsApiExplorer();
|
builder.Services.AddEndpointsApiExplorer();
|
||||||
@@ -65,15 +68,17 @@ if (openRedis == "1")
|
|||||||
builder.Services.AddMvc(options =>
|
builder.Services.AddMvc(options =>
|
||||||
{
|
{
|
||||||
options.Filters.Add(typeof(GlobalActionMonitor));//全局注册
|
options.Filters.Add(typeof(GlobalActionMonitor));//全局注册
|
||||||
})
|
});
|
||||||
|
builder.Services.AddControllers()
|
||||||
|
//解析来自客户端的 POST 请求中的 JSON 数据
|
||||||
.AddJsonOptions(options =>
|
.AddJsonOptions(options =>
|
||||||
{
|
{
|
||||||
//options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString;
|
//options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString;
|
||||||
options.JsonSerializerOptions.WriteIndented = true;
|
options.JsonSerializerOptions.WriteIndented = true;
|
||||||
|
options.JsonSerializerOptions.Converters.Add(new DateTimeArrayConverter()); // 注册新的转换器
|
||||||
options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeConverter());
|
options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeConverter());
|
||||||
options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeNullConverter());
|
options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeNullConverter());
|
||||||
options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeArrayConverter());
|
|
||||||
options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeNullableArrayConverter());
|
|
||||||
options.JsonSerializerOptions.Converters.Add(new StringConverter());
|
options.JsonSerializerOptions.Converters.Add(new StringConverter());
|
||||||
//PropertyNamingPolicy属性用于前端传过来的属性的格式策略,目前内置的仅有一种策略CamelCase
|
//PropertyNamingPolicy属性用于前端传过来的属性的格式策略,目前内置的仅有一种策略CamelCase
|
||||||
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
|
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
|
||||||
@@ -117,6 +122,8 @@ app.Use(async (context, next) =>
|
|||||||
});
|
});
|
||||||
//使用全局异常中间件
|
//使用全局异常中间件
|
||||||
app.UseMiddleware<GlobalExceptionMiddleware>();
|
app.UseMiddleware<GlobalExceptionMiddleware>();
|
||||||
|
//创建一个中间件来统一处理所有进入的 HTTP GET 请求,并对其中可能存在的 UTC 格式的时间数组进行转换
|
||||||
|
//app.UseMiddleware<UtcToLocalMiddleware>();
|
||||||
|
|
||||||
// 配置中间件以支持本地化
|
// 配置中间件以支持本地化
|
||||||
var supportedCultures = new List<CultureInfo> {
|
var supportedCultures = new List<CultureInfo> {
|
||||||
|
|||||||
@@ -14,4 +14,10 @@ namespace DOAN.Model.MES.Group.Dto
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class TestQuery
|
||||||
|
{
|
||||||
|
public DateTime JobDatetime { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,35 +22,24 @@ namespace DOAN.Service.MES.Group
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="parm"></param>
|
/// <param name="parm"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public List<AchievementDto> GetstaffAchievementList(AchievementQueryDto parm)
|
public List<AchievementDto> GetstaffAchievementList(AchievementQueryDto parm)
|
||||||
{
|
{
|
||||||
var predicate = QueryExp(parm);
|
var predicate = QueryExp(parm);
|
||||||
var result= Context.Queryable<ProReportwork01>().Where(predicate.ToExpression())
|
var result = Context.Queryable<ProReportwork01>().Where(predicate.ToExpression())
|
||||||
.GroupBy(x => x.Worker)
|
.GroupBy(it => it.Worker)
|
||||||
.Select(it=>new AchievementDto
|
.Select(it => new AchievementDto
|
||||||
{
|
{
|
||||||
Worker = it.Worker,
|
Worker = it.Worker,
|
||||||
|
MaterialUse = SqlFunc.AggregateSum(it.ProcessId == 10 ? it.FinishNum ?? 0 : 0),
|
||||||
MaterialUse=SqlFunc.Subqueryable<ProReportwork01>().Where(x=>x.Worker==it.Worker&&x.ProcessId==10).Where(predicate.ToExpression()).Sum(x=>x.FinishNum??0),
|
MechanicalProcessing = SqlFunc.AggregateSum(it.ProcessId == 20 ? it.FinishNum ?? 0 : 0),
|
||||||
|
MiddleCheck = SqlFunc.AggregateSum(it.ProcessId == 30 ? it.FinishNum ?? 0 : 0),
|
||||||
MechanicalProcessing = SqlFunc.Subqueryable<ProReportwork01>().Where(x => x.Worker == it.Worker && x.ProcessId == 20).Where(predicate.ToExpression()).Sum(x => x.FinishNum ?? 0),
|
Handgrind = SqlFunc.AggregateSum(it.ProcessId == 40 ? it.FinishNum ?? 0 : 0),
|
||||||
|
Machinegrind = SqlFunc.AggregateSum(it.ProcessId == 50 ? it.FinishNum ?? 0 : 0),
|
||||||
MiddleCheck = SqlFunc.Subqueryable<ProReportwork01>().Where(x => x.Worker == it.Worker && x.ProcessId == 10).Where(predicate.ToExpression()).Sum(x => x.FinishNum ?? 0),
|
Finegrind = SqlFunc.AggregateSum(it.ProcessId == 60 ? it.FinishNum ?? 0 : 0),
|
||||||
|
WarehouseInspection = SqlFunc.AggregateSum(it.ProcessId == 70 ? it.FinishNum ?? 0 : 0),
|
||||||
Handgrind = SqlFunc.Subqueryable<ProReportwork01>().Where(x => x.Worker == it.Worker && x.ProcessId == 10).Where(predicate.ToExpression()).Sum(x => x.FinishNum ?? 0),
|
Shipment = SqlFunc.AggregateSum(it.ProcessId == 90 ? it.FinishNum ?? 0 : 0)
|
||||||
|
}).Distinct()
|
||||||
Machinegrind = SqlFunc.Subqueryable<ProReportwork01>().Where(x => x.Worker == it.Worker && x.ProcessId == 10).Where(predicate.ToExpression()).Sum(x => x.FinishNum ?? 0),
|
.ToList();
|
||||||
|
|
||||||
|
|
||||||
Finegrind = SqlFunc.Subqueryable<ProReportwork01>().Where(x => x.Worker == it.Worker && x.ProcessId == 10).Where(predicate.ToExpression()).Sum(x => x.FinishNum ?? 0),
|
|
||||||
|
|
||||||
|
|
||||||
WarehouseInspection = SqlFunc.Subqueryable<ProReportwork01>().Where(x => x.Worker == it.Worker && x.ProcessId == 10).Where(predicate.ToExpression()).Sum(x => x.FinishNum ?? 0),
|
|
||||||
|
|
||||||
|
|
||||||
Shipment = SqlFunc.Subqueryable<ProReportwork01>().Where(x => x.Worker == it.Worker && x.ProcessId == 10).Where(predicate.ToExpression()).Sum(x => x.FinishNum ?? 0),
|
|
||||||
|
|
||||||
}).Distinct().ToList();
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
foreach (var item in result)
|
foreach (var item in result)
|
||||||
{
|
{
|
||||||
@@ -62,11 +51,11 @@ namespace DOAN.Service.MES.Group
|
|||||||
|
|
||||||
private static Expressionable<ProReportwork01> QueryExp(AchievementQueryDto parm)
|
private static Expressionable<ProReportwork01> QueryExp(AchievementQueryDto parm)
|
||||||
{
|
{
|
||||||
|
|
||||||
var predicate = Expressionable.Create<ProReportwork01>()
|
var predicate = Expressionable.Create<ProReportwork01>()
|
||||||
.AndIF(!string.IsNullOrEmpty(parm.Worker), it => it.Worker.Contains(parm.Worker))
|
.AndIF(!string.IsNullOrEmpty(parm.Worker), it => it.Worker.Contains(parm.Worker))
|
||||||
.AndIF(parm.JobDatetime != null&& parm.JobDatetime[0]>DateTime.MinValue, it => it.JobDateTime >=parm.JobDatetime[0])
|
.AndIF(parm.JobDatetime != null && parm.JobDatetime[0] > DateTime.MinValue, it => it.JobDateTime >= parm.JobDatetime[0])
|
||||||
.AndIF(parm.JobDatetime != null&& parm.JobDatetime[0]>DateTime.MinValue, it => it.JobDateTime <=parm.JobDatetime[1])
|
.AndIF(parm.JobDatetime != null && parm.JobDatetime[0] > DateTime.MinValue, it => it.JobDateTime <= parm.JobDatetime[1])
|
||||||
;
|
;
|
||||||
|
|
||||||
return predicate;
|
return predicate;
|
||||||
|
|||||||
71
DOAN.ServiceCore/Middleware/UtcToLocalMiddleware.cs
Normal file
71
DOAN.ServiceCore/Middleware/UtcToLocalMiddleware.cs
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
using Microsoft.AspNetCore.Hosting;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.Extensions.Primitives;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DOAN.ServiceCore.Middleware
|
||||||
|
{
|
||||||
|
public class UtcToLocalMiddleware
|
||||||
|
{
|
||||||
|
private readonly RequestDelegate _next;
|
||||||
|
|
||||||
|
public UtcToLocalMiddleware(RequestDelegate next)
|
||||||
|
{
|
||||||
|
_next = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task InvokeAsync(HttpContext context)
|
||||||
|
{
|
||||||
|
// 检查是否是GET请求
|
||||||
|
if (HttpMethods.IsGet(context.Request.Method))
|
||||||
|
{
|
||||||
|
var query = context.Request.Query; // 获取查询参数集合
|
||||||
|
var queryParams = new List<KeyValuePair<string, StringValues>>();
|
||||||
|
|
||||||
|
foreach (var queryParameter in query)
|
||||||
|
{
|
||||||
|
if(queryParameter.Value.Count()>0)
|
||||||
|
{
|
||||||
|
foreach (var value in queryParameter.Value)
|
||||||
|
{
|
||||||
|
if (DateTime.TryParse(value,
|
||||||
|
CultureInfo.InvariantCulture,
|
||||||
|
DateTimeStyles.AssumeUniversal,
|
||||||
|
out DateTime utcDate))
|
||||||
|
{
|
||||||
|
// 转换为本地时间
|
||||||
|
var localTime = utcDate.ToLocalTime();
|
||||||
|
|
||||||
|
queryParams.Add(new KeyValuePair<string, StringValues>(queryParameter.Key, new StringValues(localTime.ToString("o"))));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 如果不是时间格式,则保持原样添加
|
||||||
|
queryParams.Add(new KeyValuePair<string, StringValues>(queryParameter.Key, new StringValues(value)));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构建新的 QueryString
|
||||||
|
var newQueryString = string.Join("&", queryParams.Select(kv => $"{kv.Key}={Uri.EscapeDataString(kv.Value)}"));
|
||||||
|
context.Request.QueryString = new QueryString("?" + newQueryString);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call the next delegate/middleware in the pipeline
|
||||||
|
await _next(context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
31
DOAN.ServiceCore/ModelBinder/LocalDateModelBinder.cs
Normal file
31
DOAN.ServiceCore/ModelBinder/LocalDateModelBinder.cs
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
|
using System;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
public class LocalDateModelBinder : IModelBinder
|
||||||
|
{
|
||||||
|
public Task BindModelAsync(ModelBindingContext bindingContext)
|
||||||
|
{
|
||||||
|
var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
|
||||||
|
|
||||||
|
if (valueProviderResult == ValueProviderResult.None)
|
||||||
|
return Task.CompletedTask;
|
||||||
|
|
||||||
|
var dateStr = valueProviderResult.FirstValue;
|
||||||
|
|
||||||
|
// 尝试根据特定格式和当前文化信息解析日期字符串
|
||||||
|
if (DateTime.TryParse(dateStr, CultureInfo.CurrentCulture, DateTimeStyles.AssumeLocal, out DateTime parsedDate))
|
||||||
|
{
|
||||||
|
bindingContext.Result = ModelBindingResult.Success(parsedDate);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bindingContext.ModelState.TryAddModelError(
|
||||||
|
bindingContext.ModelName,
|
||||||
|
"Invalid date format.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
15
DOAN.ServiceCore/ModelBinder/LocalDateModelBinderProvider.cs
Normal file
15
DOAN.ServiceCore/ModelBinder/LocalDateModelBinderProvider.cs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
public class LocalDateModelBinderProvider : IModelBinderProvider
|
||||||
|
{
|
||||||
|
public IModelBinder GetBinder(ModelBinderProviderContext context)
|
||||||
|
{
|
||||||
|
if (context.Metadata.ModelType == typeof(DateTime))
|
||||||
|
{
|
||||||
|
return new LocalDateModelBinder();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,9 +12,11 @@ namespace Infrastructure.Converter
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class DateTimeNullConverter : JsonConverter<DateTime?>
|
public class DateTimeNullConverter : JsonConverter<DateTime?>
|
||||||
{
|
{
|
||||||
|
//该方法用于将 JSON 字符串反序列化为 DateTime? 类型的值。
|
||||||
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||||
=> string.IsNullOrEmpty(reader.GetString()) ? default : ParseDateTime(reader.GetString());
|
=> string.IsNullOrEmpty(reader.GetString()) ? default : ParseDateTime(reader.GetString());
|
||||||
|
|
||||||
|
//方法用于将 DateTime? 类型的值序列化为 JSON 字符串
|
||||||
public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
|
public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
|
||||||
=> writer.WriteStringValue(value?.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
|
=> writer.WriteStringValue(value?.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
|
||||||
}
|
}
|
||||||
@@ -39,85 +41,47 @@ namespace Infrastructure.Converter
|
|||||||
}
|
}
|
||||||
|
|
||||||
//******************************DOAN JSON 转换器处理日期数组****************************************
|
//******************************DOAN JSON 转换器处理日期数组****************************************
|
||||||
public class DateTimeArrayConverter : JsonConverter<DateTime>
|
public class DateTimeArrayConverter : JsonConverter<IEnumerable<DateTime>>
|
||||||
{
|
{
|
||||||
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
public override IEnumerable<DateTime> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||||
{
|
{
|
||||||
if (reader.TokenType == JsonTokenType.String)
|
if (reader.TokenType == JsonTokenType.StartArray)
|
||||||
{
|
{
|
||||||
if (DateTime.TryParse(reader.GetString(), out var date))
|
var list = new List<DateTime>();
|
||||||
|
while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
|
||||||
{
|
{
|
||||||
return date;
|
if (reader.TokenType == JsonTokenType.String)
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new JsonException("Invalid date format");
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
|
|
||||||
{
|
|
||||||
writer.WriteStringValue(value.ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DateTimeNullableArrayConverter : JsonConverter<DateTime?[]>
|
|
||||||
{
|
|
||||||
public override DateTime?[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
|
||||||
{
|
|
||||||
if (reader.TokenType != JsonTokenType.StartArray)
|
|
||||||
{
|
|
||||||
throw new JsonException("Expected start of array.");
|
|
||||||
}
|
|
||||||
|
|
||||||
var dates = new List<DateTime?>();
|
|
||||||
|
|
||||||
while (reader.Read())
|
|
||||||
{
|
|
||||||
if (reader.TokenType == JsonTokenType.EndArray)
|
|
||||||
{
|
|
||||||
return dates.ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reader.TokenType == JsonTokenType.String)
|
|
||||||
{
|
|
||||||
var dateString = reader.GetString();
|
|
||||||
if (string.IsNullOrEmpty(dateString))
|
|
||||||
{
|
{
|
||||||
dates.Add(null);
|
var dateTime = ParseDateTime(reader.GetString());
|
||||||
}
|
if (dateTime != null)
|
||||||
else if (DateTime.TryParse(dateString, out var date))
|
{
|
||||||
{
|
list.Add(dateTime.Value.ToLocalTime()); // 将UTC时间转为本地时间
|
||||||
dates.Add(date);
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new JsonException($"Invalid date format: {dateString}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
return list;
|
||||||
{
|
|
||||||
throw new JsonException("Expected string value in array.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
throw new JsonException();
|
||||||
throw new JsonException("Unexpected end of JSON.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Write(Utf8JsonWriter writer, DateTime?[] value, JsonSerializerOptions options)
|
public override void Write(Utf8JsonWriter writer, IEnumerable<DateTime> value, JsonSerializerOptions options)
|
||||||
{
|
{
|
||||||
writer.WriteStartArray();
|
writer.WriteStartArray();
|
||||||
foreach (var date in value)
|
foreach (var date in value)
|
||||||
{
|
{
|
||||||
if (date.HasValue)
|
writer.WriteStringValue(date.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
|
||||||
{
|
|
||||||
writer.WriteStringValue(date.Value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
writer.WriteNullValue();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
writer.WriteEndArray();
|
writer.WriteEndArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static DateTime? ParseDateTime(string dateStr)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(dateStr) && DateTime.TryParse(dateStr, out var dateVal))
|
||||||
|
{
|
||||||
|
return dateVal; // 假设输入的已经是UTC时间
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user