引言:为什么 C# 中的日期和时间处理是每个开发者的基础
每个 C# 开发者迟早都会遇到处理日期和时间的需求。无论是事件日志记录、业务应用程序中的期限计算,还是仅仅在屏幕上显示当前日期——没有熟练掌握 DateTime 和 TimeSpan 是行不通的。在本文中,我们将探讨所有关键方面:从创建对象到时区处理和性能优化。本材料适用于初学者以及希望系统化知识的有经验的程序员。
.NET 中用于处理日期和时间的主要类型
在 .NET 中,有几种类型,每种类型解决特定的任务。让我们看看其中的主要类型。
DateTime —— 基础中的基础
DateTime 是一个表示时间点(日期和时间)的结构。它支持从 0001 年 1 月 1 日到 9999 年 12 月 31 日的范围。可以通过多种方式创建对象:
// 当前日期和时间DateTime now = DateTime.Now;// 当前 UTC 日期和时间DateTime utcNow = DateTime.UtcNow;// 特定日期DateTime specificDate = new DateTime(2025, 3, 15);// 精确到秒的日期和时间DateTime withTime = new DateTime(2025, 3, 15, 14, 30, 0);// 今天的日期(时间为 00:00:00)DateTime today = DateTime.Today;TimeSpan —— 时间间隔
TimeSpan 表示一段时间间隔(两个日期之间的差值)。它便于计算操作的持续时间:
// 创建间隔TimeSpan interval = new TimeSpan(2, 5, 30); // 2 小时, 5 分钟, 30 秒// 日期之间的差值DateTime start = DateTime.Now;System.Threading.Thread.Sleep(1000); // 模拟工作DateTime end = DateTime.Now;TimeSpan duration = end - start;Console.WriteLine($"过去了 {duration.TotalSeconds} 秒");DateTimeOffset —— 带时区的日期
对于处理来自不同地区用户的现代应用程序,DateTimeOffset 至关重要。它存储日期和时间以及相对于 UTC 的偏移量:
// 当前时间及本地偏移量DateTimeOffset localOffset = DateTimeOffset.Now;// 具有特定偏移量的时间DateTimeOffset customOffset = new DateTimeOffset(2025, 3, 15, 12, 0, 0, TimeSpan.FromHours(3));// 转换为 UTCDateTime utc = localOffset.UtcDateTime;日期的格式化和解析
正确地向用户显示日期以及从字符串中读取数据是必备技能。
格式化:ToString() 和自定义模式
ToString() 方法接受一个格式字符串。最常用的标准格式:
"d"—— 短日期 (15.03.2025)"D"—— 长日期 (2025 年 3 月 15 日)"t"—— 短时间 (14:30)"T"—— 长时间 (14:30:00)"g"—— 常规日期/时间格式 (15.03.2025 14:30)
自定义格式化示例:
DateTime dt = new DateTime(2025, 3, 15, 14, 30, 45);Console.WriteLine(dt.ToString("yyyy-MM-dd")); // 2025-03-15Console.WriteLine(dt.ToString("dd.MM.yyyy HH:mm")); // 15.03.2025 14:30Console.WriteLine(dt.ToString("dddd, MMMM yyyy")); // 星期六, 三月 2025 (取决于区域性)解析:将字符串转换为日期
对于可靠的解析,请使用 DateTime.TryParse 或 DateTime.ParseExact:
string dateString = "15.03.2025";if (DateTime.TryParse(dateString, out DateTime result)){ Console.WriteLine($"成功: {result}");}else{ Console.WriteLine("解析错误");}
// 指定格式的精确解析string exactString = "2025-03-15 14:30:00";DateTime parsed = DateTime.ParseExact(exactString, "yyyy-MM-dd HH:mm