应使用 DateTime.DayOfWeek 枚举判断周末,即 date.DayOfWeek is DayOfWeek.Saturday or DayOfWeek.Sunday;避免 ToString("dddd") 字符串比较,因其依赖文化、大小写敏感且性能差。

直接看结论:用 DateTime.DayOfWeek 属性,它返回 DayOfWeek 枚举值,比字符串比较或魔法数字靠谱得多;周末判断就是检查是否为 DayOfWeek.Saturday 或 DayOfWeek.Sunday。
为什么别用 ToString() 或字符串匹配判断周末
有人会写 date.ToString("dddd") == "Saturday",这看似直观,但实际埋了坑:
- 依赖当前线程的
CultureInfo,换语言环境(比如系统设成中文)就变成"星期六",直接失效 - 大小写敏感,
"saturday"会判错 - 性能差:每次都要格式化字符串再比对
而 DayOfWeek 是强类型枚举,编译期校验、零开销、跨文化安全。
DayOfWeek 枚举值和实际星期几的对应关系
注意:这个枚举的数值是固定的,但**不代表“周几从几开始”是全球统一的**:
-
DayOfWeek.Sunday = 0,DayOfWeek.Saturday = 6 - 数值顺序固定,但“一周第一天是周日还是周一”由文化习惯决定 —— 枚举值本身不参与文化适配,只表示逻辑星期位
- 所以判断周末永远用
date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday,别依赖数值== 0 || == 6(虽然目前成立,但语义不清,易误导)
一行代码判断是否为周末
最常用、最安全的写法:
bool isWeekend = date.DayOfWeek is DayOfWeek.Saturday or DayOfWeek.Sunday;
兼容 C# 9+;如果用旧版本,写成:
bool isWeekend = date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday;
补充两个实用场景:
- 获取某天是星期几的中文名(按当前文化):
date.ToString("dddd", CultureInfo.CurrentCulture)—— 这个才需要文化上下文,和枚举判断不冲突 - 想把枚举转成自定义显示名(比如“周六”),用
switch或字典映射,而不是硬编码字符串比较
真正容易被忽略的是:很多人在做排班、定时任务或报表过滤时,会顺手把 DayOfWeek 当作“第几天”去算偏移,却忘了它只是标识,不是序号;一旦混用 .DayOfWeek 和 DateTime.AddDays() 的逻辑步长,边界就容易错半拍。


















