会。DayOfWeek.ToString()返回英文名,非UI线程或无文化上下文时无法可靠输出中文;推荐用数组映射(如weekdays[(int)day]),安全稳定且不依赖线程文化。

DayOfWeek 枚举值直接转中文会出错吗?
会。C# 的 DayOfWeek 是枚举,值为 0–6(Sunday 到 Saturday),但它的 .ToString() 返回英文名(如 "Monday"),不是中文,也不能直接用 Convert.ToString() 或格式化字符串(如 d.ToString("dddd"))在非 UI 线程或无当前文化上下文时可靠输出中文。
最简安全方案:用数组映射(推荐基础场景)
不依赖线程文化、不触发异常、性能高,适合控制台、服务、DTO 转换等轻量需求:
string[] weekdays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
DayOfWeek day = DateTime.Now.DayOfWeek;
string cnDay = weekdays[(int)day]; // 注意:Sunday 是 0,对应 "星期日"
- 必须确保数组顺序与
DayOfWeek枚举定义一致(Sunday=0,Monday=1…) - 别写成
weekdays[day.GetHashCode()]——GetHashCode()不保证返回序号 - 如果业务要求周一为每周第一天(如财务周),仍用这个数组,但注意逻辑上需自行调整偏移,不要改数组顺序
需要支持多语言或绑定到 UI 控件时用 DateTimeFormatInfo
依赖当前线程的 CultureInfo,适合 WinForms/WPF/ASP.NET 等有明确文化上下文的场景:
string cnDay = DateTimeFormatInfo.CurrentInfo.GetAbbreviatedDayName(DayOfWeek.Monday); // 或完整名称: string full = DateTimeFormatInfo.CurrentInfo.GetAbbreviatedDayName(DayOfWeek.Monday); // "周一" string longName = DateTimeFormatInfo.CurrentInfo.GetAbbreviatedDayName(DayOfWeek.Monday); // 实际是缩写;要全称得用 GetAbbreviatedDayName + 替换,或手动映射
-
GetAbbreviatedDayName()在中文环境下返回 "周X"(如 "周一"),不是 "星期X" - 若需 "星期一",仍建议用数组映射,或组合:
"星期" + "日一二三四五六"[(int)day] - 在 ASP.NET Core 后端 API 中,
CurrentInfo可能是 invariant culture,导致返回英文 —— 此时数组方案更稳
ToString("dddd") 为什么有时显示英文?
因为 DateTime.ToString("dddd") 读取的是当前线程的 CultureInfo,不是系统区域设置,也不是代码所在机器的语言:
- 控制台程序默认用
InvariantCulture,输出 "Monday" - WPF 主线程通常继承系统语言,可能输出 "星期一"
- ASP.NET Core 默认用
InvariantCulture,除非显式配置UseRequestLocalization() - 跨线程(如
Task.Run)后,新线程 culture 是InvariantCulture,即使主线程已设中文
所以别依赖它“自动变中文”,除非你全程掌控 culture 设置。
数组映射看着土,但它是唯一不引入隐式依赖、不因线程切换失效、不需额外配置的方案。真正上线前,务必在目标运行环境(如 Linux Docker 容器、IIS 应用池)里实测一次输出。


















