You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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日期:

  1. 传递YYYY-MM-DD格式字符串

    const selectedDate = this.formControl.date1.value;
    // 提取日期部分,仅发送年月日
    scheme.date1 = selectedDate.toISOString().split('T')[0];
    

    后端模型对应属性设为string或DateTime(ASP.NET Core会自动解析为本地日期)。

  2. 转换为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:57:23