任务三 DateTime 类
高考考点
掌握DateTime类的属性:
Date、Day、Hour、Minute、Month、Today、Year、Now;
说明
DateTime是C#中表示日期和时间的结构体(值类型),位于System命名空间下;
Now:获取当前系统的日期+时间(含毫秒);Today:获取当前系统的日期(时间部分为00:00:00);- 所有示例需先引入
using System;。
1. Date
| 项 | 说明 |
|---|---|
| 用途 | 获取当前DateTime对象的日期部分(时间部分被重置为 00:00:00.000) |
| 语法 | DateTime变量.Date |
| 参数 | 无 |
| 注意事项 | 1. 返回值为DateTime类型,仅保留日期,时间部分固定为午夜;2. 与 Today的区别:Today是静态属性(获取当前日期),Date是实例属性(获取任意DateTime的日期部分);3. 不会修改原 DateTime对象(值类型特性)。 |
示例(Date)
// 获取当前时间(含日期+时间)
DateTime now = DateTime.Now;
Console.WriteLine($"原始时间:{now}"); // 输出:2026/2/23 15:30:25.123(示例值)
// 获取仅日期部分(时间重置为00:00:00)
DateTime onlyDate = now.Date;
Console.WriteLine($"仅日期部分:{onlyDate}"); // 输出:2026/2/23 00:00:00
2. Day
| 项 | 说明 |
|---|---|
| 用途 | 获取当前DateTime对象表示的月份中的第几天(1~31) |
| 语法 | DateTime变量.Day |
| 参数 | 无 |
| 注意事项 | 1. 返回值为int类型,范围12. 不同月份的天数不同(如2月可能返回1 3. 对 DateTime.MinValue/MaxValue也适用,无越界风险。 |
示例(Day)
// 示例1:当前日期的天数
DateTime today = DateTime.Today;
Console.WriteLine($"今天是当月第{today.Day}天"); // 输出:今天是当月第23天(示例值)
// 示例2:指定日期的天数
DateTime specificDate = new DateTime(2026, 2, 29); // 2026年2月无29天,会抛异常
DateTime validDate = new DateTime(2024, 2, 29); // 2024是闰年,2月有29天
Console.WriteLine($"2024年2月29日的Day值:{validDate.Day}"); // 输出:29
3. Hour
| 项 | 说明 |
|---|---|
| 用途 | 获取当前DateTime对象表示的小时数(24小时制,0~23) |
| 语法 | DateTime变量.Hour |
| 参数 | 无 |
| 注意事项 | 1. 返回值为int类型,范围0~23(如凌晨0点返回0,下午3点返回15);2. 12小时制需自行转换(如 Hour > 12 ? Hour - 12 : Hour);3. Today的Hour始终为0(时间部分是00:00:00)。 |
示例(Hour)
// 获取当前时间的小时数
DateTime now = DateTime.Now;
int hour = now.Hour;
string period = hour >= 12 ? "下午" : "上午";
int twelveHour = hour > 12 ? hour - 12 : hour;
Console.WriteLine($"当前时间是{period}{twelveHour}点"); // 输出:当前时间是下午3点(示例值,15点)
4. Minute
| 项 | 说明 |
|---|---|
| 用途 | 获取当前DateTime对象表示的分钟数(0~59) |
| 语法 | DateTime变量.Minute |
| 参数 | 无 |
| 注意事项 | 1. 返回值为int类型,范围0~59(如整点返回0,30分返回30);2. 毫秒部分不影响Minute值(如15:30:59.999的Minute仍为30); 3. 可结合Hour拼接完整时间(如 $"{Hour}:{Minute:D2}",D2补零)。 |
示例(Minute)
// 获取当前时间的分钟数
DateTime now = DateTime.Now;
// 补零显示(如5分显示为05)
string minuteStr = now.Minute.ToString("D2");
Console.WriteLine($"当前分钟数:{minuteStr}"); // 输出:当前分钟数:30(示例值)
// 拼接小时+分钟
string time = $"{now.Hour:D2}:{now.Minute:D2}";
Console.WriteLine($"当前时间(时:分):{time}"); // 输出:当前时间(时:分):15:30(示例值)
5. Month
| 项 | 说明 |
|---|---|
| 用途 | 获取当前DateTime对象表示的月份(1~12) |
| 语法 | DateTime变量.Month |
| 参数 | 无 |
| 注意事项 | 1. 返回值为int类型,范围12. 可结合 CultureInfo转换为月份名称(如1月→"一月"/"January");3. 不存在0或13月的情况,所有 DateTime对象的Month均在1 |
示例(Month)
using System.Globalization; // 需引入此命名空间
// 示例1:获取当前月份
DateTime today = DateTime.Today;
Console.WriteLine($"当前月份:{today.Month}月"); // 输出:当前月份:2月(示例值)
// 示例2:转换为月份名称
string monthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(today.Month);
Console.WriteLine($"月份名称(中文):{monthName}"); // 输出:月份名称(中文):二月
string englishMonth = CultureInfo.InvariantCulture.DateTimeFormat.GetMonthName(today.Month);
Console.WriteLine($"月份名称(英文):{englishMonth}"); // 输出:月份名称(英文):February
6. Today
| 项 | 说明 |
|---|---|
| 用途 | 静态属性,获取当前系统的日期(时间部分固定为 00:00:00.000) |
| 语法 | DateTime.Today |
| 参数 | 无 |
| 注意事项 | 1. 静态属性,无需实例化DateTime,直接调用;2. 返回值为 DateTime类型,仅包含日期,时间为午夜;3. 与 Now.Date等价,但Today性能略优(无需处理时间部分);4. 基于系统本地时间,受时区影响。 |
示例(Today)
// 获取今日日期(无时间)
DateTime today = DateTime.Today;
Console.WriteLine($"今日日期:{today:yyyy-MM-dd}"); // 输出:今日日期:2026-02-23(示例值)
Console.WriteLine($"Today的时间部分:{today.ToLongTimeString()}"); // 输出:Today的时间部分:00:00:00
// 对比Now和Today
DateTime now = DateTime.Now;
Console.WriteLine($"Now:{now}"); // 2026/2/23 15:30:25.123
Console.WriteLine($"Today:{today}"); // 2026/2/23 00:00:00
7. Year
| 项 | 说明 |
|---|---|
| 用途 | 获取当前DateTime对象表示的年份(如2026、1999) |
| 语法 | DateTime变量.Year |
| 参数 | 无 |
| 注意事项 | 1. 返回值为int类型,范围1~9999(DateTime的年份范围);2. 可用于判断闰年(需结合Month/Day,或调用 DateTime.IsLeapYear(Year));3. DateTime.MinValue.Year为1,DateTime.MaxValue.Year为9999。 |
示例(Year)
// 示例1:获取当前年份
DateTime today = DateTime.Today;
Console.WriteLine($"当前年份:{today.Year}"); // 输出:当前年份:2026(示例值)
// 示例2:判断闰年
int year = 2024;
bool isLeap = DateTime.IsLeapYear(year);
Console.WriteLine($"{year}年{(isLeap ? "是" : "不是")}闰年"); // 输出:2024年是闰年
// 示例3:通过DateTime对象判断闰年
DateTime leapYearDate = new DateTime(2024, 2, 1);
Console.WriteLine($"{leapYearDate.Year}年{(DateTime.IsLeapYear(leapYearDate.Year) ? "是" : "不是")}闰年");
8. Now
| 项 | 说明 |
|---|---|
| 用途 | 静态属性,获取当前系统的日期+时间(含毫秒,精确到系统时钟) |
| 语法 | DateTime.Now |
| 参数 | 无 |
| 注意事项 | 1. 静态属性,直接调用,无需实例化; 2. 返回值为 DateTime类型,包含完整的日期和时间(年、月、日、时、分、秒、毫秒);3. 受系统时间影响,若系统时间修改, Now值也会变化;4. 如需高精度时间,用 DateTime.UtcNow(UTC时间)或Stopwatch。 |
示例(Now)
// 获取当前完整时间
DateTime now = DateTime.Now;
Console.WriteLine($"当前完整时间:{now}"); // 输出:2026/2/23 15:30:25.123(示例值)
// 格式化输出
Console.WriteLine($"格式化时间:{now:yyyy-MM-dd HH:mm:ss.fff}"); // 输出:2026-02-23 15:30:25.123
// 对比Now和UtcNow(UTC时间,无时区偏移)
DateTime utcNow = DateTime.UtcNow;
Console.WriteLine($"UTC时间:{utcNow}"); // 输出:2026/2/23 07:30:25.123(东8区时差)
总结(核心关键点)
- 属性类型:
- 静态属性:
Today、Now(直接通过DateTime.XXX调用); - 实例属性:
Date、Day、Hour、Minute、Month、Year(需通过DateTime对象调用);
- 静态属性:
- 值范围:
Day:131,12,Month:1Hour:023,59,Minute:0Year:1~9999;
- 核心区别:
Today=Now.Date(仅日期,时间为0);Date是实例属性,可获取任意DateTime的日期部分,Today仅获取当前日期;
- 格式化:推荐用
ToString("yyyy-MM-dd HH:mm:ss")等格式字符串,统一输出样式。
DateTime 是 C# 中非常重要的一个类,几乎所有跟“时间”相关的功能都离不开它,比如获取当前时间、计算时间差、格式化时间字符串等等。
一、DateTime 是什么?
DateTime是System命名空间下的一个结构(struct)- 用来表示一个具体的时间点:年、月、日、时、分、秒、毫秒
- 默认值是
0001/01/01 00:00:00
二、如何获取当前时间?
DateTime now = DateTime.Now;
Console.WriteLine(now); // 示例输出:2025/07/23 13:10:45
| 成员名 | 含义 |
|---|---|
DateTime.Now | 当前本地时间 |
DateTime.UtcNow | 当前 UTC 时间 |
DateTime.Today | 当前日期,时间为 00:00:00 |
三、如何创建一个指定时间的 DateTime 对象?
DateTime dt = new DateTime(2025, 7, 23, 9, 30, 0);
Console.WriteLine(dt); // 输出:2025/07/23 09:30:00
构造函数格式:
new DateTime(年, 月, 日, 时, 分, 秒);
四、如何提取时间的某一部分?
DateTime now = DateTime.Now;
int year = now.Year;
int month = now.Month;
int day = now.Day;
int hour = now.Hour;
int minute = now.Minute;
int second = now.Second;
Console.WriteLine($"{year}-{month}-{day} {hour}:{minute}:{second}");
| 属性名 | 含义 |
|---|---|
Year | 年 |
Month | 月 |
Day | 日 |
Hour | 时 |
Minute | 分 |
Second | 秒 |
DayOfWeek | 星期几 |
DayOfYear | 一年中的第几天 |
五、如何进行时间加减运算?
DateTime now = DateTime.Now;
DateTime tomorrow = now.AddDays(1);
DateTime oneHourLater = now.AddHours(1);
DateTime nextMonth = now.AddMonths(1);
Console.WriteLine(tomorrow);
Console.WriteLine(oneHourLater);
Console.WriteLine(nextMonth);
| 方法 | 含义 |
|---|---|
AddDays(n) | 增加 n 天(可以是负数) |
AddHours(n) | 增加 n 小时 |
AddMinutes(n) | 增加 n 分钟 |
AddMonths(n) | 增加 n 个月 |
AddYears(n) | 增加 n 年 |
六、如何计算时间差?
DateTime start = new DateTime(2025, 7, 1);
DateTime end = new DateTime(2025, 7, 23);
TimeSpan diff = end - start;
Console.WriteLine(diff.TotalDays); // 22
TimeSpan是一个“时间间隔”对象,表示两个DateTime之间的差值TotalDays、TotalHours、TotalMinutes是浮点数
七、如何格式化时间输出?
DateTime now = DateTime.Now;
string s1 = now.ToString("yyyy-MM-dd HH:mm:ss");
string s2 = now.ToString("MM/dd/yyyy");
string s3 = now.ToString("dddd"); // 星期几(英文)
Console.WriteLine(s1); // 2025-07-23 13:20:30
Console.WriteLine(s2); // 07/23/2025
Console.WriteLine(s3); // Wednesday
| 格式字符串 | 含义 |
|---|---|
yyyy | 年(四位) |
MM | 月(两位) |
dd | 日 |
HH | 小时(24小时制) |
hh | 小时(12小时制) |
mm | 分 |
ss | 秒 |
dddd | 星期几(英文) |
八、判断两个时间的早晚(比较)
DateTime a = new DateTime(2025, 1, 1);
DateTime b = new DateTime(2025, 12, 1);
if (a < b)
{
Console.WriteLine("a 比 b 更早");
}
也可以用:
int result = DateTime.Compare(a, b);
// result < 0 表示 a < b
// result == 0 表示相等
// result > 0 表示 a > b
九、DateTime 常见陷阱
| 陷阱 | 说明 |
|---|---|
| 默认值是 0001 年 | DateTime 是值类型,不赋值时默认是最早的时间 |
| 不自动转时区 | DateTime.Now 是本地时间;UtcNow 是全球统一时间 |
与 string 互转要格式统一 | 用 Parse()、TryParse() 转换字符串时要格式匹配 |
十、总结口诀
“获取用 Now,计算用 Add,格式用 ToString,比较用 < >,差值用减号。”
练习题
练习1
获取当前时间,并输出成 "2025年07月23日 14:00" 格式。
练习 2
计算你的生日距离今天还有多少天。
练习3
判断某个时间是否在 9 点~18 点之间。
练习4
输出当前是一周的第几天(如:3 表示星期三)。
1.格式化时间
题目
获取当前时间,并输出成
"2025年07月23日 14:00"格式。
输出
答案
2.生日还有多少天
题目
如果你的生日是 10 月 8 日,请计算从今天开始,还要等多少天。
提示:
- 使用
DateTime.Today获取今天日期- 构造一个生日的
DateTime对象- 如果生日已过,则加一年:
AddYears(1)- 用减法算出
TimeSpan,再用.Days
输出
答案
3.判断时间点
题目
判断某个时间是否在 9 点~18 点之间。
输出
答案
4.判断星期几
题目
输出当前是一周的第几天(如:3 表示星期三)。
输出
答案
5.输出今天的日期和当前时间
题目
请编写一段程序,输出类似如下格式的字符串:
今天是:2025年07月23日,当前时间是:13:45:22提示: 使用
DateTime.Now.ToString("yyyy年MM月dd日 HH:mm:ss")。
输出
答案
6.获取并输出“星期几”
题目
输入一个日期(如
2025-12-25),程序应输出该日期是星期几,例如:Thursday**提示:**使用
DateTime.Parse()+DateTime.DayOfWeek属性。
输出
答案
7.模拟一个“倒计时”提示
题目
活动截止日期是 2025-08-01,写程序输出“还剩多少天活动结束”。
**提示:**同样用
DateTime end - DateTime.Today得到差值。
输出
答案
8.判断当前时间是否在上班时间段内
题目
如果当前是 13:15,应输出“现在是上班时间”;如果是 19:00,应输出“现在是下班时间”。
提示:上班时间(9:00~17:00)
- 获取当前时间的小时数:
DateTime.Now.Hour- 判断
>=9 && <17
输出
答案
9.格式化输出时间
题目
将当前时间以多种格式输出,例如:
2025-07-23 13:45:22
23/07/2025
Wednesday
2025年07月23日 星期三提示: 使用
.ToString("格式")以及中文星期用CultureInfo
输出
答案
10.判断两个时间是否属于同一天
题目
给定两个时间,判断
t1和t2是否是同一天。DateTime t1 = new DateTime(2025, 7, 23, 8, 30, 0); DateTime t2 = new DateTime(2025, 7, 23, 22, 0, 0);
提示:使用
.Date属性比较即可:t1.Date == t2.Date
输出
答案
11.解析用户输入的时间
题目
提示用户输入时间字符串,如果格式正确则输出解析结果,否则提示“格式错误”。
提示:使用
DateTime.TryParse(string, out DateTime)方法进行安全解析。
输出
答案
12.编写程序统计程序运行时长
题目
记录程序开始和结束的时间,输出总耗时(秒)。
DateTime start = DateTime.Now; // 模拟操作 DateTime end = DateTime.Now; TimeSpan duration = end - start;
输出
答案
13.转换时间戳
题目
将
DateTime转换为毫秒时间戳(Unix 时间)。进阶题目,了解即可
提示
DateTimeOffset dto = new DateTimeOffset(DateTime.UtcNow);
long timestamp = dto.ToUnixTimeMilliseconds();
Console.WriteLine(timestamp);
答案
14.各种类型转字符串
// 将各种类型转换为字符串
bool isActive = true;
DateTime now = DateTime.Now;
string status = "状态: " + isActive.ToString();
string timeInfo = "当前时间: " + now.ToString("yyyy-MM-dd");
Console.WriteLine(status);
Console.WriteLine(timeInfo);