C# 日期和时间处理:高级技巧与建议

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C# 日期和时间高级处理:从理论到实际任务

日期和时间处理是开发中最常见也最棘手的任务之一。在初级阶段,我们只是简单地创建 DateTime.Now 并输出到控制台。但当项目超出玩具规模时,复杂性就会出现:夏令时切换、不同时区、高精度计算或处理无时区日期。本文将深入探讨 C# (.NET) 中日期和时间处理的高级技巧,帮助您编写可靠且可预测的代码。



1. DateTime、DateTimeOffset 和 TimeSpan:选择正确的工具

许多开发人员默认使用 DateTime,却没有考虑其局限性。在高级层面,理解这三种主要类型之间的区别至关重要。



DateTime

存储日期和时间。其主要问题是歧义性。Kind 属性(Local、Utc、Unspecified)并不总是显式设置,这会导致序列化或比较时出错。



DateTimeOffset

存储日期、时间和相对于 UTC 的偏移量。这是推荐的类型,用于存储时间点,因为它能明确地确定时间轴上的一个点。例如,2025-03-15T14:00:00+03:00 始终是一个具体时刻,与用户的时区无关。



TimeSpan

表示时间间隔,而非具体时刻。用于算术运算:日期差、超时、操作持续时间。



// 示例:DateTime vs DateTimeOffsetDateTime localNow = DateTime.Now; // Kind = LocalDateTime utcNow = DateTime.UtcNow; // Kind = Utc

DateTimeOffset preciseNow = DateTimeOffset.Now; // 始终包含偏移量

// 比较:DateTimeOffset 更明确Console.WriteLine(preciseNow.Offset); // +03:00 或 -05:00 等


建议: 对于新项目,使用 DateTimeOffset 存储时间点,使用 TimeSpan 存储时间间隔,仅在必要时(例如与旧代码兼容)使用 DateTime。



2. 解析和格式化:如何避免 FormatException

从字符串解析日期是许多错误的根源,尤其是当字符串来自用户或不同区域设置时。



区域设置相关的解析

对于内部数据交换(例如 JSON、API),请使用 CultureInfo.InvariantCulture。对于用户输入,请考虑用户的区域设置。



// 考虑区域设置的解析string dateString = "15.03.2025";var ruCulture = new CultureInfo("ru-RU");DateTime parsedDate = DateTime.Parse(dateString, ruCulture);

// 固定区域设置解析(推荐用于 API)string isoString = "2025-03-15T14:00:00Z";DateTimeOffset parsedIso = DateTimeOffset.Parse(isoString, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);


使用 TryParseExact 确保可靠性

如果字符串格式已知,请使用 TryParseExact 并显式指定格式。这样可以避免意外的异常。



string input = "2025-03-15 14:30";string format = "yyyy-MM-dd HH:mm";if (DateTime.TryParseExact(input, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result)){    Console.WriteLine($"成功: {result}");}else{    Console.WriteLine("解析错误");}


自定义格式化

标准格式说明符(d, D, t, T)很好,但为了精确控制,请使用自定义格式字符串。



DateTime now = DateTime.Now;Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss.fff")); // 2025-03-15 14:30:45.123Console.WriteLine(now.ToString("dd MMMM yyyy, dddd"));      // 15 三月 2025, 星期六

博客

书籍推荐