
摘要摘要本文系统性地介绍了 C# 中 DateTime 类型的核心操作涵盖标准与自定义日期时间格式化、常用属性方法、时间计算与比较以及实际开发中的最佳实践。通过丰富的代码示例帮助开发者快速掌握日期时间处理的精髓提升代码质量与开发效率。1. 引言在 C# 开发中日期和时间的处理是几乎每个项目都会涉及的基础功能。无论是数据展示、日志记录、定时任务还是业务逻辑计算都离不开对 DateTime 类型的熟练操作。然而DateTime 的格式化、转换和计算中存在许多细节和陷阱不正确的使用可能导致显示错误、计算偏差甚至业务逻辑问题。本文旨在提供一份全面、实用的 C# 日期时间处理指南从最基本的格式化输出到复杂的时区处理从简单的日期比较到精确的时间差计算帮助开发者构建健壮、可维护的日期时间处理代码。2. 标准日期时间格式字符串C# 提供了丰富的标准格式字符串可以快速生成符合特定区域设置的日期时间字符串。使用DateTime.ToString(string format)方法时传入单个字符的格式说明符即可。2.1 常用标准格式说明符格式字符说明示例输出d短日期模式2025/8/1D长日期模式2025年8月1日t短时间模式10:41T长时间模式10:41:12f完整日期和时间长日期和短时间2025年8月1日 10:41F完整日期和时间长日期和长时间2025年8月1日 10:41:12g常规短日期和短时间2025/8/1 10:41G常规短日期和长时间2025/8/1 10:41:12s可排序的日期时间模式ISO 86012025-08-01T10:41:12u通用可排序日期时间模式2025-08-01 10:41:12ZU使用通用时间的完整日期时间2025年8月1日 2:41:122.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四位数的年份2025yy两位数的年份25MM两位数的月份01-1208M一位或两位数的月份1-128dd两位数的日期01-3101d一位或两位数的日期1-311HH24小时制的小时00-2314H24小时制的小时0-2314hh12小时制的小时01-1202h12小时制的小时1-122mm分钟00-5905m分钟0-595ss秒00-5909s秒0-599fff毫秒三位数123ttAM/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)); // 年度报告20253.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; // 2125. 时间比较与计算在实际开发中经常需要比较两个时间的先后或计算时间间隔。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