问题描述
public string BeginDate
{
get
{
var time = BeginTime.ToString().Split(" ");
return time[0];
}
}
public string _BeginTime
{
get
{
var time = BeginTime.ToString().Split(" ");
return time[1];
}
}
我期望通过以上代码,得到格式化后的日期并分割。
本地测试时得到期望结果
"beginDate": "2025/12/15",
"_BeginTime": "9:07:21"
生产环境部署后得到结果不一致,不仅日期变成了 M/d/yyyy,时间也是 12 小时制,前面还没补零。
"beginDate": "1/11/2026",
"_BeginTime": "6:37:59"
问题原因
- 本地 Windows 语言是“中文(简体,中国)” →
zh-CN
默认短日期格式:yyyy/MM/dd;时间:HH:mm:ss(24 小时) - 生产服务器是英文 Windows + IIS,线程 Culture 默认
en-US
默认短日期格式:M/d/yyyy;时间:h:mm:ss(12 小时,无前置 0)
DateTime.ToString() 不带参数时,最终输出格式由线程当前的 CultureInfo 决定。
本地跑的时候,线程文化恰好是 zh-CN,所以拿到 yyyy/MM/dd 和 HH:mm:ss(24 小时)。
发布到服务器后,操作系统或 IIS 的默认文化变成了 en-US,于是成了 M/d/yyyy 和 h:mm:ss(12 小时,不带前导 0)。
解决方案
直接指定格式字符串
using System.Globalization;
public string BeginDate => BeginTime.ToString("yyyy/MM/dd", CultureInfo.InvariantCulture);
public string _BeginTime => BeginTime.ToString("HH:mm:ss", CultureInfo.InvariantCulture);
yyyy/MM/dd强制四位年、两位月、两位日,补零且顺序固定。HH:mm:ss强制 24 小时制。CultureInfo.InvariantCulture彻底摆脱线程文化影响。
如果字段是可空 DateTime? 先把值取出来再格式化:
public string BeginDate => BeginTime?.ToString("yyyy/MM/dd", CultureInfo.InvariantCulture) ?? "";
public string _BeginTime => BeginTime?.ToString("HH:mm:ss", CultureInfo.InvariantCulture) ?? "";
可选策略
在 ASP.NET Core 的 Startup.Configure 里加:
var ci = new CultureInfo("zh-CN");
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture(ci),
SupportedCultures = new[] { ci },
SupportedUICultures = new[] { ci }
});
这样整个站点默认文化就是 zh-CN,但接口返回的日期仍建议显式格式化
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END










暂无评论内容