当前位置: 首页 > news >正文

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
http://www.jsqmd.com/news/1310290/

相关文章:

  • Localized Data Coverage Mechanism for Southeast Asia, Japan and Korea Advertising Markets - 芈只AI研究院
  • 2026年建材采购选PVC护角条 梳理全国源头厂比对方向 - 奔跑123
  • Jetson Nano三路继电器控制:从GPIO原理到AI联动实战
  • 2026 年新发布:天津可靠的吊车租赁公司哪家权威,花最少的钱搞定重型工程?这细节没摸透,小心多花几倍冤枉钱。-华顺达吊车出租 - 实业推荐官【官方】
  • 玉溪CMA甲醛检测公司测甲醛中心怎么选:国康CMA检测标准、流程、避坑指南 - CMA甲醛检测中心
  • 免费解锁NVIDIA显卡隐藏性能:5个简单技巧提升游戏体验
  • 2026年全国洗衣机排水泵电机轴加工厂家调研近况 - 奔跑123
  • 2026年8月南京机械革命电脑蓝屏怎么办|分步检测、送检准备与复测清单 - 售后数码产品专业
  • 绥化CMA甲醛检测公司测甲醛中心怎么选:国康CMA检测标准、流程、避坑指南 - CMA甲醛检测中心
  • 英雄联盟Akari助手:免费开源的游戏效率工具,快速提升操作水平
  • 2026 年当下,会东比较好的河道边坡客土喷播优质厂家哪个好,河道护坡的秘诀,这玩意儿比传统种草快3倍还稳当 - 行业推荐官【认证】
  • 丹东CMA甲醛检测公司测甲醛中心怎么选:国康CMA检测标准、流程、避坑指南 - CMA甲醛检测中心
  • 13.3英寸QHD AMOLED屏幕驱动与调优全攻略:从点亮到色彩管理
  • 2026年合肥标识标牌生产厂家选哪家?——深度解析本地化定制与稳定供货之道 - 装修教育财税推荐2026
  • 5分钟免费解锁WeMod专业版:终极Wand-Enhancer使用指南
  • 2026年浙江工程领域钢断桥入户门优质公司汇总推荐 - 奔跑123
  • 岳阳CMA甲醛检测公司测甲醛中心怎么选:国康CMA检测标准、流程、避坑指南 - CMA甲醛检测中心
  • 2026年全国智能家电行业走心机加工相关厂家参考 - 奔跑123
  • 4步焕新方案:用macOS系统升级工具让老旧Mac重获新生
  • 2026 年 7 月新发布:衡水诚信的拍门制造厂选哪家,深夜小区传出沉闷声响,物业赶到时才发现那扇旧铁门的特殊用途。-常兴水利机械厂 - 行业推荐【认证官】
  • 边缘AI上线即崩溃?这4种云边协同架构选型陷阱,正在 silently 拖垮你的交付周期
  • 200、NPU的编译器开发:总结与展望:嵌入式AI的下一个十年
  • 随州CMA甲醛检测公司测甲醛中心怎么选:国康CMA检测标准、流程、避坑指南 - CMA甲醛检测中心
  • 2026 年更新:殷都专业的随车吊出租厂家哪家靠谱,想省吊装费?这款大家伙帮你搞定高效搬运难题-富喜工程机械租赁 - 行业严选官
  • 2026 年新发布:遂宁可靠的篮球场围网制造厂哪家靠谱,楼下篮球场这玩意儿,竟藏着这么多你不知道的门道? - 实业推荐官【官方】
  • 龙岩CMA甲醛检测公司测甲醛中心怎么选:国康CMA检测标准、流程、避坑指南 - CMA甲醛检测中心
  • 德宏CMA甲醛检测公司测甲醛中心怎么选:国康CMA检测标准、流程、避坑指南 - CMA甲醛检测中心
  • 终极免费视频图片压缩工具:CompressO完整使用指南,轻松减少90%文件大小
  • ST3215舵机深度解析:从核心参数到实战应用与故障排查
  • 云浮CMA甲醛检测公司测甲醛中心怎么选:国康CMA检测标准、流程、避坑指南 - CMA甲醛检测中心