日期和时间操作
掌握
DateTime、TimeSpan、DateTimeOffset核心结构熟练进行日期格式化、解析与计算
了解时区处理与 UTC 时间最佳实践
核心讲解
(1)DateTime 日期时间
表示一个具体的时间点,值类型,精度 100 纳秒。
获取当前:
DateTime.Now(本地时间)、DateTime.UtcNow(世界标准时间,推荐服务端用)指定日期:
new DateTime(年, 月, 日, 时, 分, 秒)字段:
Year、Month、Day、Hour、Minute、Second、DayOfWeek、DayOfYear加减:
AddDays()、AddMonths()、AddHours()等,支持负数
(2)TimeSpan 时间间隔
表示一段时间,用来做日期计算、时间差。
创建:
TimeSpan.FromHours(2)、new TimeSpan(时,分,秒)字段:
TotalDays、TotalHours、TotalMinutes(总数值,推荐)运算:两个 DateTime 相减得到 TimeSpan
(3)DateTimeOffset 带偏移时间
带时区偏移的时间,比 DateTime 更安全,不会丢失时区信息,跨时区、服务端推荐用。
(4)格式化与解析
格式化:
ToString("格式字符串")yyyy四位年、MM两位月、dd两位日HH24 小时、hh12 小时、mm分、ss秒
解析:
DateTime.Parse()、DateTime.TryParse()、DateTime.ParseExact()(精确格式)
操作步骤
编写日期创建、计算、格式化代码
运行观察输出结果
验证时区与 UTC 转换
代码示例
// 1. 获取当前时间
DateTime now = DateTime.Now;
DateTime utcNow = DateTime.UtcNow;
Console.WriteLine($"本地时间:{now}");
Console.WriteLine($"UTC时间:{utcNow}");
// 2. 指定日期
DateTime birthday = new DateTime(2000, 5, 20, 14, 30, 0);
Console.WriteLine($"\n生日:{birthday:yyyy年MM月dd日 HH:mm:ss}");
Console.WriteLine($"星期:{birthday.DayOfWeek}");
Console.WriteLine($"当年第{birthday.DayOfYear}天");
// 3. 日期计算
Console.WriteLine($"\n7天后:{now.AddDays(7):yyyy-MM-dd}");
Console.WriteLine($"3个月前:{now.AddMonths(-3):yyyy-MM-dd}");
// 4. 时间差
TimeSpan delta = now - birthday;
Console.WriteLine($"\n出生至今:{delta.TotalDays:F0}天");
Console.WriteLine($"约 {delta.TotalYears:F1} 年");
// 5. 字符串解析
string dateStr = "2024-01-15 14:30:00";
DateTime parsed = DateTime.Parse(dateStr);
Console.WriteLine($"\n解析后:{parsed:yyyy/MM/dd}");
// 精确格式解析
string str = "2024年01月15日";
DateTime exact = DateTime.ParseExact(str, "yyyy年MM月dd日", null);
Console.WriteLine($"精确解析:{exact:yyyy-MM-dd}");
// 6. DateTimeOffset 带时区
DateTimeOffset dto = DateTimeOffset.Now;
Console.WriteLine($"\n带偏移时间:{dto:yyyy-MM-dd HH:mm zzz}");
Console.ReadKey();
常见误区
格式符大小写混淆:
MM是月,mm是分;HH是 24 小时,hh是 12 小时,写错会时间错乱本地时间存数据库:服务端、数据库推荐存 UTC 时间,返回前端再转本地,避免时区问题
日期计算自己加减天数:不要自己算,用 Add 方法,自动处理闰年、大小月
Parse 格式不匹配:格式不确定用 TryParse,确定格式用 ParseExact
课后练习
获取当前日期,格式化为
yyyy年MM月dd日 HH时mm分计算你的出生日期到今天一共多少天、多少小时
计算今年的国庆节是星期几
说明 DateTime.Now 和 DateTime.UtcNow 的区别,服务端推荐用哪个?

