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

MVC C#本地日期正常,服务器却取日期最小值问题排查

解决MVC C#项目部署后日期参数取最小值的问题

这个问题我碰到过不少次,核心原因是你把DateTime转成带tt(上午/下午标识)的字符串传递给SQL参数,而服务器的区域设置和本地不一致,导致SQL Server无法正确解析这个日期字符串,最终默认使用了DateTime的最小值。

问题根源分析

你当前的代码把DateTime对象转成了格式化字符串:

cmdp.Parameters.AddWithValue("@fys", _dtFYS.ToString("yyyy-MM-dd hh:mm:ss tt"));
  • 本地调试时,你的机器区域设置(比如中文)能让SQL正确识别“上午/下午”标识;
  • 部署到服务器后,服务器的区域可能是英文或其他不兼容的设置,SQL解析带中文“上午/下午”的字符串时失败,就会返回DateTime.MinValue。

而且,传递字符串类型的日期本身就不是最佳实践——ADO.NET完全支持直接传递DateTime强类型参数,不需要转成字符串。

修复方案(推荐)

直接传递DateTime对象,不要转成字符串,让ADO.NET自动处理和数据库的类型映射:

DateTime _dtFYS = new DateTime(_lab.fys.Year, _lab.fys.Month, _lab.fys.Day, 0, 0, 1);
DateTime _dtFYE = new DateTime(_lab.fye.Year, _lab.fye.Month, _lab.fye.Day, 23, 59, 59);

// 直接传入DateTime类型,无需格式化字符串
cmdp.Parameters.AddWithValue("@fys", _dtFYS);
cmdp.Parameters.AddWithValue("@fye", _dtFYE);

额外注意事项(前端到后端的日期传递)

如果你的_lab.fys和_lab.fye是从jQuery DatePicker前端传递过来的,后端接收时也要确保用不变文化解析,避免区域差异:

// 假设前端传递的是"yyyy-MM-dd"格式的字符串
string fysStr = Request.Form["fys"];
DateTime fys = DateTime.ParseExact(fysStr, "yyyy-MM-dd", CultureInfo.InvariantCulture);

这样不管服务器是什么区域设置,都能正确解析前端传来的日期。

内容的提问来源于stack exchange,提问作者Gokul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:25:14