应优先使用 DateTime.Now 而非 DateTime.UtcNow 进行前端时间展示,因其反映用户本地时区和夏令时;格式化推荐 ToString("yyyy-MM-dd HH:mm:ss") 或插值 $"{{DateTime.Now:yyyy-MM-dd HH:mm}}",注意大小写敏感及文化信息。

直接用 DateTime.Now 获取当前系统时间,用 ToString() 或字符串插值配合格式字符串来控制显示效果——这是最常用、最可靠的方式,无需引用额外库或配置时区。
为什么不用 DateTime.UtcNow?
除非你明确在做跨时区服务或日志时间对齐,否则 DateTime.Now 才是反映用户本地系统设置的正确选择。DateTime.UtcNow 返回的是协调世界时(UTC),它不随系统时区变化,直接显示会和用户看到的系统托盘时间不一致。
- 用户看到的任务栏时间 =
DateTime.Now的结果(受系统时区+夏令时影响) -
DateTime.UtcNow永远比北京时间(CST)慢 8 小时,硬用会导致界面时间错乱 - 如果后续要存数据库,再考虑转换为 UTC;前端展示一律优先用
DateTime.Now
ToString() 格式字符串怎么写才不翻车?
别记复杂规则,按需组合几个关键占位符就行。大小写敏感,MM 是月份、mm 是分钟,写错就变成“03月15分”这种诡异结果。
- 常用安全组合:
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")→2024-06-12 14:23:05 - 想带中文:“yyyy年MM月dd日 HH:mm” →
2024年06月12日 14:23 - 短日期 + 24小时制:使用
"G"标准格式(DateTime.Now.ToString("G")),自动适配系统区域设置 - 避免用
"YYYY"——它是“基于周的年份”,不是日历年,2023年12月30日可能显示为2024
用字符串插值($"")时要注意什么?
插值写法更简洁,但容易漏掉转义或格式参数位置错乱。必须用冒号 : 分隔变量和格式字符串,且整个格式串要用双引号包裹。
- 正确:
$"{DateTime.Now:yyyy-MM-dd HH:mm}" - 错误:
$"{DateTime.Now:yyyy-MM-dd HH:mm:ss}"后面多了一个}(实际不会编译通过) - 错误:
$"{DateTime.Now:yyyy年MM月dd日}"中文字符未加引号——C# 允许,但团队规范建议统一用英文格式+外部翻译 - 性能上无差异,.NET 6+ 对插值做了优化,可放心用
真正容易被忽略的是文化信息(CultureInfo)。如果应用部署在非中文系统(比如英文 Windows),"dddd" 会输出 Wednesday 而不是“星期三”。需要强制中文显示时,得显式传入 new CultureInfo("zh-CN"),否则光靠格式字符串搞不定。


















