C# 日期时间处理完全指南:格式化、转换与常用操作

📅 2026/8/2 1:19:41 👁️ 阅读次数 📝 编程学习
C# 日期时间处理完全指南:格式化、转换与常用操作

摘要

摘要:本文系统性地介绍了 C# 中 DateTime 类型的核心操作,涵盖标准与自定义日期时间格式化、常用属性方法、时间计算与比较,以及实际开发中的最佳实践。通过丰富的代码示例,帮助开发者快速掌握日期时间处理的精髓,提升代码质量与开发效率。

1. 引言

在 C# 开发中,日期和时间的处理是几乎每个项目都会涉及的基础功能。无论是数据展示、日志记录、定时任务还是业务逻辑计算,都离不开对 DateTime 类型的熟练操作。然而,DateTime 的格式化、转换和计算中存在许多细节和陷阱,不正确的使用可能导致显示错误、计算偏差甚至业务逻辑问题。

本文旨在提供一份全面、实用的 C# 日期时间处理指南,从最基本的格式化输出到复杂的时区处理,从简单的日期比较到精确的时间差计算,帮助开发者构建健壮、可维护的日期时间处理代码。

2. 标准日期时间格式字符串

C# 提供了丰富的标准格式字符串,可以快速生成符合特定区域设置的日期时间字符串。使用DateTime.ToString(string format)方法时,传入单个字符的格式说明符即可。

2.1 常用标准格式说明符

格式字符说明示例输出
d短日期模式2025/8/1
D长日期模式2025年8月1日
t短时间模式10:41
T长时间模式10:41:12
f完整日期和时间(长日期和短时间)2025年8月1日 10:41
F完整日期和时间(长日期和长时间)2025年8月1日 10:41:12
g常规(短日期和短时间)2025/8/1 10:41
G常规(短日期和长时间)2025/8/1 10:41:12
s可排序的日期时间模式(ISO 8601)2025-08-01T10:41:12
u通用可排序日期时间模式2025-08-01 10:41:12Z
U使用通用时间的完整日期时间2025年8月1日 2:41:12

2.2 使用示例

using System; class Program { static void Main() { DateTime now = DateTime.Now; Console.WriteLine("短日期: " + now.ToString("d")); Console.WriteLine("长日期: " + now.ToString("D")); Console.WriteLine("短时间: " + now.ToString("t")); Console.WriteLine("长时间: " + now.ToString("T")); Console.WriteLine("完整日期时间(短时间): " + now.ToString("f")); Console.WriteLine("完整日期时间(长时间): " + now.ToString("F")); Console.WriteLine("ISO 8601格式: " + now.ToString("s")); Console.WriteLine("通用时间: " + now.ToString("u")); } }

3. 自定义日期时间格式字符串

当标准格式无法满足需求时,可以使用自定义格式字符串。自定义格式由特定的格式说明符组合而成,提供了极高的灵活性。

3.1 自定义格式说明符

格式模式说明示例
yyyy四位数的年份2025
yy两位数的年份25
MM两位数的月份(01-12)08
M一位或两位数的月份(1-12)8
dd两位数的日期(01-31)01
d一位或两位数的日期(1-31)1
HH24小时制的小时(00-23)14
H24小时制的小时(0-23)14
hh12小时制的小时(01-12)02
h12小时制的小时(1-12)2
mm分钟(00-59)05
m分钟(0-59)5
ss秒(00-59)09
s秒(0-59)9
fff毫秒(三位数)123
ttAM/PM指示器上午/下午
ddd缩写的星期几周五
dddd完整的星期几星期五
MMM缩写的月份名称8月
MMMM完整的月份名称八月

3.2 自定义格式组合示例

DateTime now = DateTime.Now; // 常见格式组合 Console.WriteLine(now.ToString("yyyy-MM-dd")); // 2025-08-01 Console.WriteLine(now.ToString("yyyy年MM月dd日")); // 2025年08月01日 Console.WriteLine(now.ToString("HH:mm:ss")); // 14:05:09 Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss")); // 2025-08-01 14:05:09 Console.WriteLine(now.ToString("ddd, dd MMM yyyy")); // 周五, 01 8月 2025 Console.WriteLine(now.ToString("yyyy年MM月dd日 dddd")); // 2025年08月01日 星期五 Console.WriteLine(now.ToString("hh:mm:ss tt")); // 02:05:09 下午 Console.WriteLine(now.ToString("yyyyMMddHHmmssfff")); // 20250801140509123 // 使用分隔符和文字 Console.WriteLine(now.ToString("'今天是' yyyy'年'MM'月'dd'日'")); // 今天是 2025年08月01日 Console.WriteLine(now.ToString(@"\年\度\报\告:yyyy")); // 年度报告:2025

3.3 重要注意事项

  • 区分大小写:格式说明符区分大小写,MM表示月份,mm表示分钟
  • 转义字符:单引号'用于包裹原义文本,反斜杠\用于转义单个字符
  • 自定义模式长度:自定义模式至少需要两个字符,单字符模式会被解释为标准格式字符

4. DateTime 常用属性和方法

DateTime 结构提供了丰富的属性和方法,用于获取和操作日期时间的各个部分。

4.1 常用属性

DateTime dt = DateTime.Now; // 获取日期时间各部分 int year = dt.Year; // 年份 (2025) int month = dt.Month; // 月份 (1-12) int day = dt.Day; // 日期 (1-31) int hour = dt.Hour; // 小时 (0-23) int minute = dt.Minute; // 分钟 (0-59) int second = dt.Second; // 秒 (0-59) int millisecond = dt.Millisecond; // 毫秒 (0-999) DayOfWeek dayOfWeek = dt.DayOfWeek; // 星期几 (Sunday-Saturday) int dayOfYear = dt.DayOfYear; // 一年中的第几天 (1-366) // 其他有用属性 DateTime dateOnly = dt.Date; // 获取日期部分,时间设为00:00:00 TimeSpan timeOfDay = dt.TimeOfDay; // 获取时间部分 long ticks = dt.Ticks; // 获取刻度数(100纳秒间隔)

4.2 常用转换方法

DateTime dt = DateTime.Now; // 转换为各种字符串格式 string shortDate = dt.ToShortDateString(); // "2025/8/1" string longDate = dt.ToLongDateString(); // "2025年8月1日" string shortTime = dt.ToShortTimeString(); // "14:05" string longTime = dt.ToLongTimeString(); // "14:05:09" string fileTime = dt.ToFileTime().ToString(); // 文件时间格式 string universalTime = dt.ToUniversalTime().ToString(); // 协调世界时 // 获取所有可用的格式 string[] allFormats = dt.GetDateTimeFormats(); // 所有标准格式的数组 string[] specificFormats = dt.GetDateTimeFormats('d'); // 特定格式的数组

4.3 日期时间计算

DateTime dt = DateTime.Now; // 添加时间间隔 DateTime tomorrow = dt.AddDays(1); // 加1天 DateTime nextMonth = dt.AddMonths(1); // 加1个月 DateTime nextYear = dt.AddYears(1); // 加1年 DateTime later = dt.AddHours(2.5); // 加2.5小时 // 减去时间间隔 DateTime yesterday = dt.AddDays(-1); // 减1天 DateTime lastWeek = dt.AddDays(-7); // 减7天 // 使用 TimeSpan 进行精确计算 TimeSpan duration = new TimeSpan(1, 2, 30, 0); // 1天2小时30分钟 DateTime future = dt.Add(duration); DateTime past = dt.Subtract(duration); // 计算两个日期之间的差值 DateTime date1 = new DateTime(2025, 1, 1); DateTime date2 = new DateTime(2025, 8, 1); TimeSpan difference = date2 - date1; // 212天 int daysBetween = (date2 - date1).Days; // 212

5. 时间比较与计算

在实际开发中,经常需要比较两个时间的先后或计算时间间隔。

5.1 时间比较方法

DateTime dt1 = DateTime.Parse("2025-08-01 10:00:00"); DateTime dt2 = DateTime.Parse("2025-08-01 14:00:00"); DateTime dt3 = DateTime.Now; // 使用 Compare 方法 int result = DateTime.Compare(dt1, dt2); if (result < 0) Console.WriteLine($"{dt1} 早于 {dt2}"); else if (result > 0) Console.WriteLine($"{dt1} 晚于 {dt2}"); else Console.WriteLine($"{dt1} 等于 {dt2}"); // 使用比较运算符 if (dt1 < dt2) Console.WriteLine("dt1 早于 dt2"); if (dt1 <= dt2) Console.WriteLine("dt1 早于或等于 dt2"); if (dt1 == dt2) Console.WriteLine("dt1 等于 dt2"); if (dt1 != dt2) Console.WriteLine("dt1 不等于 dt2"); // 与当前时间比较 if (dt3 > DateTime.Now) Console.WriteLine("dt3 是未来时间"); else if (dt3 < DateTime.Now) Console.WriteLine("dt3 是过去时间");

5.2 计算时间差

// 方法1:直接相减得到 TimeSpan DateTime start = DateTime.Parse("2025-08-01 09:00:00"); DateTime end = DateTime.Parse("2025-08-01 17:30:45"); TimeSpan duration = end - start; Console.WriteLine($"总天数: {duration.Days}"); Console.WriteLine($"总小时数: {duration.TotalHours:F2}"); Console.WriteLine($"总分钟数: {duration.TotalMinutes:F2}"); Console.WriteLine($"总秒数: {duration.TotalSeconds:F2}"); Console.WriteLine($"具体时间: {duration.Days}天 {duration.Hours}小时 {duration.Minutes}分钟 {duration.Seconds}秒"); // 方法2:使用 Subtract 方法 TimeSpan diff = end.Subtract(start); Console.WriteLine($"时间差: {diff}"); // 方法3:自定义格式化输出 string FormatTimeSpan(TimeSpan ts) { return $"{ts.Days}天 {ts.Hours}小时 {ts.Minutes}分钟 {ts.Seconds}秒"; } Console.WriteLine($"格式化输出: {FormatTimeSpan(duration)}");

5.3 实用时间计算函数

/// /// 计算两个日期时间之间的绝对时间差 /// public static string GetTimeDifference(DateTime dt1, DateTime dt2) { TimeSpan ts = dt1 > dt2 ? dt1 - dt2 : dt2 - dt1; if (ts.TotalDays >= 365) { int years = (int)(ts.TotalDays / 365); int remainingDays = (int)(ts.TotalDays % 365); return $"{years}年{remainingDays}天"; } else if (ts.TotalDays >= 1) { return $"{ts.Days}天{ts.Hours}小时{ts.Minutes}分钟"; } else if (ts.TotalHours >= 1) { return $"{ts.Hours}小时{ts.Minutes}分钟{ts.Seconds}秒"; } else if (ts.TotalMinutes >= 1) { return $"{ts.Minutes}分钟{ts.Seconds}秒"; } else { return $"{ts.Seconds}秒"; } } // 使用示例 DateTime date1 = new DateTime(2025, 1, 1); DateTime date2 = new DateTime(2025, 8, 1); Console.WriteLine($"时间差: {GetTimeDifference(date1, date2)}"); // 输出: 212天0小时0分钟

6. 实际应用场景与最佳实践

6.1 数据库日期时间处理

// 保存到数据库时使用标准格式 string sqlDateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // 或使用参数化查询,避免SQL注入 // 从数据库读取时正确解析 string dbValue = "2025-08-01 14:30:00"; DateTime dbDateTime = DateTime.ParseExact(dbValue, "yyyy-MM-dd HH:mm:ss", CultureInfo.I