C# DateTime时间日期类用法详解(附带实例)
C# DateTime对象的创建
DateTime 类的使用非常有弹性,可以使用下列建构方法创建时间对象:DateTime(); DateTime(year, month, day); DateTime(year, month, day, hour, minute, second); DataTime(year, month, day, hour, minute, second, milliseconds);C# 的 DateTime 日期范围是公元 0001 年 1 月 1 日 0 时 0 分 0 秒到 9999 年 12 月 31 日 23 点 59 分 59 秒。上述如果省略日期设定,则系统默认是 0001 年 1 月 1 日,如果省略时间设置,则系统默认是 12:00:00。
【实例 1】创建时间与日期对象,然后输出。
DateTime dt0 = new DateTime(); DateTime dt1 = new DateTime(2022, 11, 28); // 只有日期 DateTime dt2 = new DateTime(2022, 11, 28, 8, 12, 23); // 日期与时间 DateTime dt3 = new DateTime(2022, 11, 28, 8, 12, 23, 300); // 含毫秒 Console.WriteLine(dt0); Console.WriteLine(dt1); Console.WriteLine(dt2); Console.WriteLine(dt3);执行结果为:
1/1/0001 12:00:00 AM
11/28/2022 12:00:00 AM
11/28/2022 8:12:23 AM
11/28/2022 8:12:23 AM
DateTime对象属性
有了 DateTime 对象后,可以有下列时间与日期等相关信息的属性可以引用:- Date:显示日期,时间则是 0:00:00。
- Year:年;
- Month:月;
- Day:日;
- Hour:时;
- Minute:分;
- Second:秒;
- MilliSecond:毫秒;
- TimeOfDay:此对象的时间(含 Ticks);
- DayOfWeek:此对象是星期几;
- DayOfYear:此对象是今年第几天;
- Now:目前系统的日期与时间;
- UtcNow:UTC 格林尼治时间;
- Today:目前系统的日期,时间是 0:00:00;
- Ticks:10,000,000,Tick 等于 1 秒,回传此对象的刻度(Tick)数目。
【实例 2】输出 DateTime 对象的基础属性。
DateTime dt = new DateTime(2024, 11, 28, 8, 12, 23, 300); // 含毫秒 Console.WriteLine($"日期:{dt.Date}"); Console.WriteLine($"年份:{dt.Year}"); Console.WriteLine($"月份:{dt.Month}"); Console.WriteLine($"日:{dt.Day}"); Console.WriteLine($"时:{dt.Hour}"); Console.WriteLine($"分:{dt.Minute}"); Console.WriteLine($"秒:{dt.Second}"); Console.WriteLine($"毫秒:{dt.Millisecond}");执行结果为:
日期:11/28/2024 12:00:00 AM
年份:2024
月份:11
日:28
时:8
分:12
秒:23
毫秒:300
【实例 3】认识 TimeOfDay/DayOfWeek/DayOfYear 属性。
DateTime dt = new DateTime(2024, 11, 28, 8, 12, 23, 300); // 含毫秒 Console.WriteLine($"时间:{dt.TimeOfDay}"); Console.WriteLine($"星期几:{dt.DayOfWeek}"); Console.WriteLine($"第几天:{dt.DayOfYear}");执行结果为:
时间:08:12:23.3000000
星期几:Thursday
第几天:333
【实例 4】目前系统与格林尼治日期与时间。
DateTime dt1 = DateTime.Now; DateTime dt2 = DateTime.UtcNow; DateTime dt3 = DateTime.Today; Console.WriteLine($"目前系统日期和时间:{dt1.Date} {dt1.TimeOfDay}"); Console.WriteLine($"目前格林尼治日期与时间:{dt2.Date} {dt2.TimeOfDay}"); Console.WriteLine($"今天系统日期:{dt3.Date} {dt3.TimeOfDay}");执行结果为:
目前系统日期和时间:5/9/2025 12:00:00 AM 03:03:10.6181680
目前格林尼治日期与时间:5/9/2025 12:00:00 AM 03:03:10.6387210
今天系统日期:5/9/2025 12:00:00 AM 00:00:00
【实例 5】先输出字符串,然后隔10秒输出下一个字符串。
var startick = DateTime.Now.Ticks; long endtick; Console.WriteLine("Hello, World!"); Console.WriteLine("等待 10秒"); while (true) // 循环执行 10 秒 { endtick = DateTime.Now.Ticks; if ((endtick - startick) / 10000000 > 10) break; } Console.WriteLine("Hello, World!");执行结果为:
Hello, World!
等待 10秒
Hello, World!
DateTime ToString()方法
格式化日期与时间,我们可以将日期与时间格式搭配 DateTime 的 ToString() 方法,参数是日期字符串,此字符串规则可以参考下列内容。1) 自定义格式“yyyyy”:
- “y”:年份,从 0 到 99;
- “yy”:年份,从 00 到 99;
- “yyy”:年份,至少 3 位数;
- “yyyy”:年份,用 4 位数表示年份。
2) 自定义格式“MMMM”:
- “M”:月份,从 1 到 12;
- “MM”:月份,从 01 到 12;
- “MMM”:月份缩写名称;
- “MMMM”:月份完整名称。
3) 自定义格式“dddd”:
- “d”:表示月份的天数 1~31,单一位数日期没有前置 0;
- “dd”:表示月份的天数 1~31,单一位数日期有前置 0;
- “ddd”:代表缩写的星期;
- “dddd”:代表完整的星期。
4) 自定义格式“hh”:
- “h”:1~12 代表小时,单一位数时没有前置 0;
- “hh”:01~12 代表小时,单一位数时有前置 0;
- “H”:0~23 代表小时,单一位数时没有前置 0;
- “HH”:00~23 代表小时,单一位数时有前置 0。
5) 自定义格式“mm”:
- “m”:0~59代表分钟,单一位数时没有前置 0;
- “mm”:00~59代表分钟,单一位数时有前置 0。
6) 自定义格式“ss”:
- “s”:0~59代表秒,单一位数时没有前置 0;
- “ss”:00~59代表秒,单一位数时有前置 0。
7) 自定义格式“tt”:
- “t”:AM/PM(上午/下午)指示的第一个字符(A 或 P);
- “tt”:AM/PM(上午/下午)指示的完整字符串(AM 或 PM)。
8) 日期分隔符为“/”。
【实例 6】输出日期与时间格式的应用。
DateTime dt = DateTime.Now; Console.WriteLine("yyyy MM dd : " + dt.ToString("yyyy MM dd")); Console.WriteLine("yyyy/MM/dd : " + dt.ToString("yyyy/MM/dd")); Console.WriteLine("yyyyy MM dd ddd : " + dt.ToString("yyyyy MM dd ddd")); Console.WriteLine("yyyy MM dd dddd : " + dt.ToString("yyyy MM dd dddd")); Console.WriteLine("yyyy MM dd h:mm:ss : " + dt.ToString("yyyy MM dd h:mm:ss")); Console.WriteLine("yyyyy MM dd hh:mm:ss : " + dt.ToString("yyyyy MM dd hh:mm:ss")); Console.WriteLine("yyyyy MM dd H:mm:ss : " + dt.ToString("yyyyy MM dd H:mm:ss")); Console.WriteLine("yyyyy MM dd HH:mm:ss : " + dt.ToString("yyyyy MM dd HH:mm:ss")); Console.WriteLine("yyyyy MM dd h:mm:ss t : " + dt.ToString("yyyyy MM dd h:mm:ss t")); Console.WriteLine("yyyyy MM dd h:mm:ss tt : " + dt.ToString("yyyyy MM dd h:mm:ss tt"));执行结果为:
yyyy MM dd : 2025 05 09 yyyy/MM/dd : 2025/05/09 yyyyy MM dd ddd : 02025 05 09 Fri yyyy MM dd dddd : 2025 05 09 Friday yyyy MM dd h:mm:ss : 2025 05 09 3:10:22 yyyyy MM dd hh:mm:ss : 02025 05 09 03:10:22 yyyyy MM dd H:mm:ss : 02025 05 09 3:10:22 yyyyy MM dd HH:mm:ss : 02025 05 09 03:10:22 yyyyy MM dd h:mm:ss t : 02025 05 09 3:10:22 A yyyyy MM dd h:mm:ss tt : 02025 05 09 3:10:22 AM
【实例 7】日期与时间格式化的应用。
DateTime dt = DateTime.Now; Console.WriteLine($"{dt:D} " + dt.ToString("hh:mm:ss"));执行结果为:
Friday, May 9, 2025 03:11:26
DateTime常用方法
1) 日期加法相关函数的应用
有关加法相关函数的语法如下:public DateTime AddYear(int value); // value 是年数,可以是正或负 public DateTime AddMonth(int value); // value 是月数,可以是正或负 public DateTime AddDays(double value); // value 是天数,可以是正或负 public DateTime AddHours(double value); // value 是小时,可以是正或负 public DateTime AddMinutes(double value); // value 是分钟,可以是正或负 public DateTime AddSeconds(double value); // value 是秒数,可以是正或负 public DateTime AddMilliseconds(double value); // value 是毫秒,可以是正或负 public DateTime AddTicks(long value); // value 是 Tick 数,可以是正或负
【实例 8】日期加法相关函数的应用。
DateTime dt = DateTime.Now; Console.WriteLine($"原长日期格式 : {dt:F}"); Console.WriteLine($"AddYears(1) : {dt.AddYears(1):F}"); Console.WriteLine($"AddMonths(1) : {dt.AddMonths(1):F}"); Console.WriteLine($"AddDays(1) : {dt.AddDays(1):F}"); Console.WriteLine($"AddHours(1) : {dt.AddHours(1):F}"); Console.WriteLine($"AddMinutes(1) : {dt.AddMinutes(1):F}"); Console.WriteLine($"AddSeconds(1) : {dt.AddSeconds(1):F}"); Console.WriteLine($"原日期不变 : {dt:F}");执行结果为:
原长日期格式 : Friday, May 9, 2025 3:15:02 AM
AddYears(1) : Saturday, May 9, 2026 3:15:02 AM
AddMonths(1) : Monday, June 9, 2025 3:15:02 AM
AddDays(1) : Saturday, May 10, 2025 3:15:02 AM
AddHours(1) : Friday, May 9, 2025 4:15:02 AM
AddMinutes(1) : Friday, May 9, 2025 3:16:02 AM
AddSeconds(1) : Friday, May 9, 2025 3:15:03 AM
原日期不变 : Friday, May 9, 2025 3:15:02 AM
2) 日期比较相关函数的应用
有关日期比较相关函数的语法如下:public DateTime Compare(DateTime t1, DateTime t2);将日期与时间格式 t1 与 t2 做比较,回传格式为:
- t1 早于 t2 回传小于 0;
- t1 等于 t2 回传 0;
- t1 晚于 t2 回传大于 0。
public DateTime CompareTo(DateTime t2);上述 CompareTo 需由 DateTime 对象启动,例如由 t1 启动,语法如下:
t1.CompareTo(t2); // 回传值与Compare()相同
【实例 9】Compare()和CompareTo()日期比较的应用。
DateTime dt1 = new DateTime(2022, 11, 28, 0, 0, 0); DateTime dt2 = new DateTime(2023, 8, 1, 9, 0, 0); int result = DateTime.Compare(dt1, dt2); // 比较关系变量 string relationship; if (result < 0) relationship = "早于"; else if (result == 0) relationship = "等于"; else relationship = "晚于"; Console.WriteLine($"{dt1} {relationship} {dt2}"); result = dt2.CompareTo(dt1); // dt2 比较 dt1 if (result < 0) relationship = "早于"; else if (result == 0) relationship = "等于"; else relationship = "晚于"; Console.WriteLine($"{dt2} {relationship} {dt1}");执行结果为:
11/28/2022 12:00:00 AM 早于 8/1/2023 9:00:00 AM
8/1/2023 9:00:00 AM 晚于 11/28/2022 12:00:00 AM
3) 月份的天数DaysInMonth()
方法 DaysInMonth() 可以回传月份的天数,此方法的语法如下:public static int DaysInMonth(int year, int month);
【实例 10】回传 2022 年 10 月和 2023 年 2 月的天数。
const int October = 10; const int Feb = 2; int daysInOct = DateTime.DaysInMonth(2022, October); Console.WriteLine($"2022年10月天数:{daysInOct}"); int daysInFeb = DateTime.DaysInMonth(2023, Feb); Console.WriteLine($"2023年 2月天数:{daysInFeb}");执行结果为:
2022年10月天数:31
2023年 2月天数:28
4) 是否闰年IsLeapYear()
方法 IsLeapYear() 可以回传是否闰年,此方法的语法如下:public static book IsLeapYear(int year);year 是 4 位数的年份。
【实例 11】列出 2000—2025 年的闰年。
for (int year = 2000; year <= 2025; year++) { if (DateTime.IsLeapYear(year)) { Console.WriteLine($"{year} 年是闰年"); } }执行结果为:
2000 年是闰年
2004 年是闰年
2008 年是闰年
2012 年是闰年
2016 年是闰年
2020 年是闰年
2024 年是闰年
5) 长/短日期与时间格式和字符串
有关转换日期与时间为长/短日期字符串,或长/短时间字符串的方法语法如下:public string ToLongDateString(); // 转成长日期字符串 public string ToLongTimeString(); // 转成长时间字符串 public string ToShortDateString(); // 转成短日期字符串 public string ToShortTimeString(); // 转成短时间字符串
【实例 12】将目前日期与时间转换成长/短日期字符串或长/短时间字符串。
DateTime dt = DateTime.Now; Console.WriteLine($"长日期字符串:{dt.ToLongDateString()}"); Console.WriteLine($"长时间字符串:{dt.ToLongTimeString()}"); Console.WriteLine($"短日期字符串:{dt.ToShortDateString()}"); Console.WriteLine($"短时间字符串:{dt.ToShortTimeString()}");执行结果为:
长日期字符串:Friday, May 9, 2025
长时间字符串:3:20:51 AM
短日期字符串:5/9/2025
短时间字符串:3:20 AM
6) 解析时间与日期字符串
常用的 Parse() 方法语法如下:public static DateTime.Parse(string s);上述 s 是要解析的日期或时间字符串,其可以是下列格式:
- 含日期与时间的字符串;
- 有日期但没有时间的字符串,会假设是午夜 12:00;
- 只有年份和月份,没有日期,会假设是该月份的第一天;
- 有月份和日期,没有年份,会假设是目前年份;
- 有时间但是没有日期,会假设为目前日期;
- 有小时和 AM/PM,没有日期,会假设为目前日期,时间则没有分钟和秒数;
- 包含日期和时间以及移位信息。
注意,如果日期与时间字符串错误,程序会中断。
TryPase() 功能相同,但是有回传值,如果转换成功则回传 true,如果转换失败则回传 false,此方法的语法如下:
bool DateTime.TryParse(str, out DateTime dt);上述第 1 个参数 str 是要解析的字符串,如果解析成功则日期与时间串存入第 2 个参数 dt,同时回传 true。如果转换失败,则回传 false。
【实例 13】系列日期与时间字符串解析。
string[] dateInfo = { "08/28/2023 09:20:12", "06/18/2023", "9/2024", "10/08", "09:30:45", "8 PM", "08/28/2023 09:20:12 -5:00"}; Console.WriteLine($"现在日期与时间 {DateTime.Now:F}"); foreach (var item in dateInfo) { Console.WriteLine($"{item,26} : {DateTime.Parse(item)}"); }执行结果为:
现在日期与时间 Friday, May 9, 2025 3:22:58 AM 08/28/2023 09:20:12 : 8/28/2023 9:20:12 AM 06/18/2023 : 6/18/2023 12:00:00 AM 9/2024 : 9/1/2024 12:00:00 AM 10/08 : 10/8/2025 12:00:00 AM 09:30:45 : 5/9/2025 9:30:45 AM 8 PM : 5/9/2025 8:00:00 PM 08/28/2023 09:20:12 -5:00 : 8/28/2023 2:20:12 PM
【实例 14】使用 TryParse() 方法替换 Parse(),同时增加一笔非 DateTime 格式的字符串。
string[] dateInfo = { "08/28/2023 09:20:12", "06/18/2023", "9/2024", "test09/13/2025", "10/08", "09:30:45", "8 PM", "08/28/2023 09:20:12 -5:00"}; Console.WriteLine($"现在日期与时间 {DateTime.Now:F}"); DateTime dt; // 未来要回传 DateTime 格式 foreach (var item in dateInfo) { if (DateTime.TryParse(item, out dt)) Console.WriteLine($"{item,26} : {dt}"); else Console.WriteLine($"{item,26} : 转换失败"); }执行结果为:
现在日期与时间 Friday, May 9, 2025 3:24:19 AM 08/28/2023 09:20:12 : 8/28/2023 9:20:12 AM 06/18/2023 : 6/18/2023 12:00:00 AM 9/2024 : 9/1/2024 12:00:00 AM test09/13/2025 : 转换失败 10/08 : 10/8/2025 12:00:00 AM 09:30:45 : 5/9/2025 9:30:45 AM 8 PM : 5/9/2025 8:00:00 PM 08/28/2023 09:20:12 -5:00 : 8/28/2023 2:20:12 PM如果使用 Parse() 转换失败,程序就会异常中止,所以一般比较常使用 TryParse(),因为可以避免程序异常中止。