C# 日期和时间处理:从入门到精通

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

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

开始课程

引言:为什么 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

博客

书籍推荐