【C#教程】DateTime.ToString()日期格式化问题

问题描述

  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/ddHH:mm:ss(24 小时)。
发布到服务器后,操作系统或 IIS 的默认文化变成了 en-US,于是成了 M/d/yyyyh: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
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容