首页 > 编程笔记 > C#笔记 阅读:15

C# DateTime时间日期类用法详解(附带实例)

C# 有关日期与时间的类是 DateTime,这是属于 System 命名空间的类,可以由这个类取得日期、时间等相关信息。

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 对象后,可以有下列时间与日期等相关信息的属性可以引用:
【实例 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

从上述看到时间单位 Ticks 部分有落差,这表示执行两道指令之间所需的系统时间。

【实例 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”:
2) 自定义格式“MMMM”:
3) 自定义格式“dddd”:
4) 自定义格式“hh”:
5) 自定义格式“mm”:
6) 自定义格式“ss”:
7) 自定义格式“tt”:
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 做比较,回传格式为:
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 是要解析的日期或时间字符串,其可以是下列格式:

注意,如果日期与时间字符串错误,程序会中断。


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(),因为可以避免程序异常中止。

相关文章