C# 日期时间处理完全指南:格式化、转换与常用操作
摘要摘要本文系统性地介绍了 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

相关新闻

基于STM32H7与IMX179传感器打造高性能UVC USB摄像头全流程解析

基于STM32H7与IMX179传感器打造高性能UVC USB摄像头全流程解析

1. 项目概述:从一颗CMOS到一台USB相机如果你手头有一颗索尼IMX179图像传感器,或者从某个旧设备上拆下来这么一块8MP的“眼睛”,有没有想过把它变成一台即插即用的USB摄像头?这听起来像是硬件极客的专属玩具,但实际上&a…

2026/8/2 1:19:09阅读更多 →
GD32H7定时器单脉冲模式寄存器级配置与调试指南

GD32H7定时器单脉冲模式寄存器级配置与调试指南

1. 从“单次触发”到“精准控制”:为什么你需要单脉冲模式?在嵌入式开发里,定时器是我们最熟悉的老朋友,从简单的延时、PWM输出,到复杂的编码器接口、输入捕获,几乎无处不在。但很多时候,我们需…

2026/8/2 1:19:09阅读更多 →
三菱FX PLC编程口通讯协议深度解析与C#实战

三菱FX PLC编程口通讯协议深度解析与C#实战

1. 项目缘起:为什么我们要深挖FX编程口协议?在工业自动化领域,三菱FX系列PLC堪称常青树,以其稳定可靠、性价比高的特点,在小型设备、产线工站中应用极广。无论是做设备维护、二次开发,还是做数据采集、上位…

2026/8/2 1:19:09阅读更多 →
基于Arduino与DS18B20的智能恒温器DIY:从传感器选型到安全部署

基于Arduino与DS18B20的智能恒温器DIY:从传感器选型到安全部署

1. 项目概述:从零打造一个智能恒温器最近在整理工作室,翻出来一堆闲置的Arduino开发板、传感器和继电器模块。看着这些元件,我就在想,与其让它们吃灰,不如动手做个真正能用起来的东西。正好家里的一个小花房&#xff0…

2026/8/2 2:31:35阅读更多 →
鸿蒙 ArkTS 实战:搜索列表 城市实时过滤(示例 94)

鸿蒙 ArkTS 实战:搜索列表 城市实时过滤(示例 94)

引言 搜索功能是现代应用中最高频的交互之一。从电商平台的商品搜索到通讯录的联系人查找,从音乐 App 的歌曲检索到城市列表的地区筛选,搜索框 列表的组合几乎出现在每一个需要数据检索的场景中。一个优秀的搜索体验需要满足三个核心要求:实…

2026/8/2 2:31:35阅读更多 →
ESP32-C6驱动1.69寸LCD屏:低功耗物联网显示方案实战

ESP32-C6驱动1.69寸LCD屏:低功耗物联网显示方案实战

1. 项目概述:ESP32-C6与1.69英寸LCD的“小钢炮”组合 最近在捣鼓一个需要低功耗、带屏幕显示的物联网小玩意儿,手头正好有块ESP32-C6的开发板和一块1.69英寸的LCD屏,就想着把它们俩凑一块儿,看看能擦出什么火花。这个“ESP32-C6-L…

2026/8/2 2:31:35阅读更多 →
统信系统剪切数据丢失!掌握方法,完成统信系统剪切数据恢复

统信系统剪切数据丢失!掌握方法,完成统信系统剪切数据恢复

使用统信 UOS 办公的用户经常遇到文件剪切中途意外中断,文件两头消失的情况,统信系统剪切数据恢复成为国产系统高频需求。剪切文件时拔下移动硬盘、电脑突然断电、系统卡顿闪退,都会造成文件既不在原文件夹,也没有保存到目标路径&…

2026/8/2 2:31:35阅读更多 →
【数据分享】2000-2026年我国乡镇级的逐月归一化植被指数(NDVI)数据(Shp/Excel格式)

【数据分享】2000-2026年我国乡镇级的逐月归一化植被指数(NDVI)数据(Shp/Excel格式)

之前我们分享过2000—2026年我国1km分辨率逐月归一化植被指数(NDVI)栅格数据,该数据来源于NASA定期发布的MOD13A3数据集!另外,我们基于此栅格数据按照行政区划取平均值,得到了Shp和Excel格式的我国省市县三…

2026/8/2 2:31:35阅读更多 →
英雄联盟上单对线博弈:剑魔与蒙多的机制克制与实战策略

英雄联盟上单对线博弈:剑魔与蒙多的机制克制与实战策略

在实际游戏对局中,英雄之间的克制关系、装备选择以及玩家操作水平共同决定了战场的走向。近期,一个围绕“ELK排位剑魔爆砍蒙多”的讨论在玩家社区中引发了热议,并衍生出“小人国国王”等趣味调侃。这背后反映的,其实是玩家对《英雄…

2026/8/2 2:29:34阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:10阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/2 0:00:12阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/2 0:00:13阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:10阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/2 0:00:12阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/2 0:00:13阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/2 1:29:34阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/2 2:32:55阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/2 2:09:20阅读更多 →