Angular Material日期选择器提交至ASP.NET Core Web API日期少一天
问题
使用Angular Material日期选择器提交日期时,ASP.NET Core Web API总是接收前一天的日期。
- 前端赋值代码:
scheme.date1 = this.formControl.date1.value; - 选择
2024年3月27日时,前端控制台打印值为:Wed Mar 27 2024 00:00:00 GMT+0530 (India Standard Time) - 服务器与前端处于同一
GMT+0530时区,但Web API接收到的日期为2024年3月26日,比选择日期早一天。
解决方案
前端处理(推荐)
前端发送请求时,避免传递带时区偏移的完整DateTime对象,改为传递纯日期字符串或标准化UTC日期:
传递YYYY-MM-DD格式字符串
const selectedDate = this.formControl.date1.value; // 提取日期部分,仅发送年月日 scheme.date1 = selectedDate.toISOString().split('T')[0];后端模型对应属性设为
string或DateTime(ASP.NET Core会自动解析为本地日期)。转换为UTC当天起始时间
const selectedDate = this.formControl.date1.value; // 构造UTC时区的当天0点,序列化后不会出现时区偏移导致的日期偏差 scheme.date1 = new Date(Date.UTC( selectedDate.getFullYear(), selectedDate.getMonth(), selectedDate.getDate() ));
后端处理
调整ASP.NET Core的JSON序列化配置,强制使用本地时区解析日期:
在Program.cs中添加JSON序列化配置:
builder.Services.AddControllers() .AddJsonOptions(options => { // 设置日期处理为本地时区 options.JsonSerializerOptions.DateTimeZoneHandling = DateTimeZoneHandling.Local; // 禁用自动转换UTC options.JsonSerializerOptions.DateParseHandling = DateParseHandling.DateTime; });
问题原因
前端Date对象在序列化为JSON时,会自动转换为UTC格式的ISO字符串(例如2024-03-26T18:30:00Z,对应GMT+0530的0点)。ASP.NET Core默认按UTC解析该字符串,即使服务器处于GMT+0530时区,也会将其转换为本地时间的前一天,最终导致日期偏差。
内容的提问来源于stack exchange,提问作者Pawan Nogariya
相关产品推荐
相关产品推荐

