C# DateTime 时间操作常用方法与格式化指南
本文总结了 C# 中 System.DateTime 类的核心用法,包括如何获取当前时间的各个组成部分、利用 ToString 方法进行多种格式的字符串转换,以及通过 AddDays 和 AddMonths 实现周、月等时间段的精确计算,并提供了详细的格式符对照表。
C# DateTime 基础获取与实例化
在 C# 开发中,处理时间最核心的类是 System.DateTime。通过实例化对象或直接调用静态属性,可以获取系统当前的完整时间信息。
第1步:实例化 DateTime 对象
目的:创建一个时间对象以便后续读取属性或进行赋值。
动作:使用 new System.DateTime() 或直接引用 DateTime.Now。
// 实例化一个 datetime 对象
System.DateTime currentTime = new System.DateTime();
// 或者直接获取当前系统完整时间
currentTime = System.DateTime.Now;
第2步:提取时间各组成部分
目的:从完整时间中提取年、月、日、时、分、秒等独立数值,用于业务逻辑判断或展示。
入口:DateTime.Now 实例的对应属性。
代码示例:
int 年 = currentTime.Year; // 当前年份
int 月 = currentTime.Month; // 当前月份 (1-12)
int 日 = currentTime.Day; // 当前天数 (1-31)
int 时 = currentTime.Hour; // 当前小时 (0-23)
int 分 = currentTime.Minute; // 当前分钟 (0-59)
int 秒 = currentTime.Second; // 当前秒 (0-59)
int 毫秒 = currentTime.Millisecond; // 当前毫秒 (0-999)
时间格式字符串转换
ToString() 方法是将 DateTime 转换为字符串的最常用手段。C# 提供了内置的预设格式(如 "d", "D", "f")以及灵活的自定义格式。
第3步:使用内置标准格式输出
目的:快速生成符合常见阅读习惯的日期时间字符串。
重要参数:格式字符串如 d, D, t, T, f, F 等。
代码示例:
// 1. 获取完整的日期和时间 (长日期 + 短时间)
string fullTime = DateTime.Now.ToString();
// 2. 只显示长日期 (例如: 2023年10月24日 星期二)
string longDate = DateTime.Now.ToLongDateString();
// 3. 只显示短日期 (例如: 2023-10-24)
string shortDate = DateTime.Now.ToShortDateString();
// 4. 中文日期格式 (不显示秒)
string chineseTimeNoSec = DateTime.Now.ToString("f");
// 5. 中文年月格式
string chineseYearMonth = DateTime.Now.ToString("y");
// 6. 中文月日格式
string chineseMonthDay = DateTime.Now.ToString("m");
// 7. 特定短日期格式: yyyy-M-d
string yMdFormat = DateTime.Now.ToString("d");
// 注意: "d" 通常等同于 ToShortDateString(),具体取决于区域设置
// 8. 中文时分格式
string chineseTimeHourMin = DateTime.Now.ToString("t");
第4步:自定义格式字符串
目的:当内置格式不满足需求时,构建自定义日期时间模板。
动作:在 ToString("...") 中使用组合模式字符,区分大小写。
关键模式说明:
yyyy: 四位数的年份,yy为两位。MM: 两位数月份(01-12),M为一位数。dd: 两位数日期(01-31),d为一位数。HH: 24小时制(00-23),hh为12小时制。
复杂时间区间计算
在处理日程、报表或统计时,经常需要获取“本周”、“上周”或“本月”的首尾日期。这可以通过 AddDays 和 AddMonths 配合 DayOfWeek 枚举来实现。
第5步:计算本周、下周及上周的时间范围
前提条件:默认一周从周日开始,周六结束(根据系统区域设置可能不同)。
动作:计算当前星期几的偏移量,加上相应天数。
代码示例:
// --- 本周 ---
// 本周第一天 (周日): 当前时间 - 今天星期几的天数
string weekStart = DateTime.Now.AddDays(-(int)DateTime.Now.DayOfWeek).ToShortDateString();
// 本周最后一天 (周六): 本周第一天 + 6天
string weekEnd = DateTime.Now.AddDays(6 - (int)DateTime.Now.DayOfWeek).ToShortDateString();
// --- 下周 ---
// 下周第一天: 本周第一天 + 7天
string nextWeekStart = DateTime.Now.AddDays(7 - (int)DateTime.Now.DayOfWeek).ToShortDateString();
// 下周最后一天
string nextWeekEnd = DateTime.Now.AddDays(13 - (int)DateTime.Now.DayOfWeek).ToShortDateString();
// --- 上周 ---
// 上周第一天: 本周第一天 - 7天
string lastWeekStart = DateTime.Now.AddDays(-7 - (int)DateTime.Now.DayOfWeek).ToShortDateString();
// 上周最后一天
string lastWeekEnd = DateTime.Now.AddDays(6 - (int)DateTime.Now.DayOfWeek - 7).ToShortDateString();
第6步:计算本月的首尾日期
目的:获取当月第一日和最后一日,常用于月度数据统计查询。
动作:构造当月1号,然后利用 AddMonths 跳转下月再减1天得到月末。
代码示例:
// 本月第一天
string monthFirstDay = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + "1";
// 更推荐的写法,避免字符串拼接潜在风险:
DateTime firstDayOfMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
// 本月最后一天
// 思路: 下个月1号 -> 往前推1天
DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);
DateTime 格式符详细参考表
以下为 ToString() 支持的标准预定义格式字符及其含义:
| 格式字符 | 关联属性/说明 |
|---|---|
| d | ShortDatePattern (短日期) |
| D | LongDatePattern (长日期) |
| f | 完整日期和时间(长日期+短时间) |
| F | FullDateTimePattern (长日期+长时间) |
| g | 常规(短日期+短时间) |
| G | 常规(短日期+长时间) |
| m, M | MonthDayPattern (月日) |
| r, R | RFC1123Pattern (Internet 标准格式) |
| s | SortableDateTimePattern (ISO 8601 本地时间) |
| t | ShortTimePattern (短时间) |
| T | LongTimePattern (长时间) |
| u | UniversalSortableDateTimePattern (通用 sortable 时间) |
| U | 使用通用时间(GMT)的完整日期和时间 |
| y, Y | YearMonthPattern (年月) |
以下是可组合的自定义格式模式(注意区分大小写):
| 格式字符 | 关联属性/说明 |
|---|---|
| d | 月中的某一天,无前导零 (1-31) |
| dd | 月中的某一天,有前导零 (01-31) |
| ddd | 周中某天的缩写名称 (如 Mon) |
| dddd | 周中某天的完整名称 (如 Monday) |
| M | 月份数字,无前导零 (1-12) |
| MM | 月份数字,有前导零 (01-12) |
| MMM | 月份的缩写名称 (如 Oct) |
| MMMM | 月份的完整名称 (如 October) |
| y | 不含纪元的年份 (<10 无前导零) |
| yy | 不含纪元的年份 (<10 有前导零) |
| yyyy | 四位数的年份 (2023) |
| gg | 时期或纪元字符串 |
| h | 12小时制小时,无前导零 (1-12) |
| hh | 12小时制小时,有前导零 (01-12) |
| H | 24小时制小时,无前导零 (0-23) |
| HH | 24小时制小时,有前导零 (00-23) |
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













