C#.Net筑基-类型系统②常见类型--日期和时间的故事

简介: 在System命名空间中,有几种表示日期时间的不可变结构体(Struct):DateTime、DateTimeOffset、TimeSpan、DateOnly和TimeOnly。DateTime包含当前本地或UTC时间,以及最小和最大值;DateTimeOffset增加了时区偏移信息,适合跨时区操作。UTC是世界标准时间,而格林尼治标准时间(GMT)不稳定,已被更精确的UTC取代。DateTimeOffset和DateTime提供了转换为UTC和本地时间的方法,以及各种解析和格式化函数。

在System命名空间中有 下面几个表示日期时间的类型:都是不可变的、结构体(Struct)

类型 说明
DateTime 常用的日期时间类型,默认使用的是本地时间(本地时区)
DateTimeOffset 支持时区偏移量的的 DateTime,适合跨时区的场景。
TimeSpan 表示一段时间的时间长度(间隔),或一天内的时间(类似时钟,无日期)
DateOnlyTimeOnly .NET 6 引入的只表示日期、时间,结构更简单轻量,适合特点场景
TimeZoneInfo 时区,可表示世界上的任何时区

📢Ticks: 上面几个时间对象中都有一个 Ticks值,其值为从公元0001/01/01开始的计数周期。1 Tick (一个周期)为100纳秒(ns),0.1微秒(us),千万分之一秒,可以看做是C#中的最小时间单位。

Console.WriteLine(DateTime.Now.Ticks);            //638504277997063647
Console.WriteLine(DateTimeOffset.Now.Ticks);      //638504277997063874
Console.WriteLine(TimeSpan.FromSeconds(1).Ticks); //10000000

3.1、什么是UTC、GMT?

UTC(Coordinated Universal Time)世界标准时间(协调时间时间),简单理解就是 0时区的时间,是国际通用时间。它与0度经线的平太阳时相差不超过1秒,接近格林尼治标准时间(GMT)。

格林尼治标准时间(Greenwich Mean Time,GMT)是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。

📢 由于地球在它的椭圆轨道里的运动速度不均匀,因此GMT是不稳定的。而UTC时间是由原子钟提供的,更为精确可靠,基本上已经取代GMT标准了。

我们日常使用的DateTime.Now获取的时间其实是带了本地时区的(TimeZone),北京时区(+8小时),就是相比UTC时间,多了8个小时的偏差(时差)。DateTime 的Kind属性为DateTimeKind枚举,指定了时区类型:

  • Unspecified:不确定的,大部分场景会被认为是Local的。
  • Utc:UTC标准时区,偏移量为0。
  • Local(默认值):本地时区的时间,偏移量根据本地时区计算,如北京时间的偏移量为+8小时
public enum DateTimeKind
{
  Unspecified,
  Utc,
  Local
}

3.2、DateTime

🔸静态成员 说明
NowUtcNow 当前本地时间、当前UTC时间,还有一个Today 只有日期部分的值
MinValueMaxValue 最小、最大值
UnixEpoch Unix 0点的时间,值就是 1970 年 1 月 1 日的 00:00:00.0000000 UTC
ParseParseExact 解析字符串转换为DateTime值,转换失败会抛出异常
TryParseTryParseExact 作用同上,安全版本的,Exact版本的方法可配置时间字符格式
🔸实例成员 说明
Date 只有日期部分的DateTime值
Kind DateTimeKind 类型,默认Local,构造函数中可以指定
Ticks 计时周期总数,单位为100ns(纳秒)
Year、Month、Day... 当前时间的年、月、日、星期等等
🔸方法
Add*** 添加值后返回一个新的 DateTime,可以为负数
ToString(String) 转换为字符串,指定日期时间格式,详细格式参考《String字符串全面了解
ToUniversalTime() 转换为UTC时间

3.3、DateTimeOffset

DateTimeOffset 和 DataTime 很像,使用、构造方式、API都差不多。主要的区别就是多了时区(偏移Offset),构造函数中可以用 TimeSpan 指定偏移量。DateTimeOffset 内部有两个比较重要的字段:

  • 用一个短整型 short _offsetMinutes 来存储时区偏移量(基于UTC),单位为分钟。
  • 用一个DateTime 存储始终为UTC的日期时间。
🔸静态成员 说明
UtcTicks (UTC) 日期和时间的计时周期数
Offset 时区偏移量,如北京时间:DateTimeOffset.Now.Offset //08:00:00
UtcDateTime 返回本地UTC的DateTime
LocalDateTime 返回本地时区的DateTime
DateTime 返回Kind类型为Unspecified的DateTime,忽略了时区的DateTime值

用一个示例来理解DataTime、DataTimeOffset的区别: 比如你在一个跨国(跨时区)团队,你要发布一个通知:

  • “本周五下午5点前提交周报”,不同时区都是周五下午5点前提交报告,虽然他们不是同一时刻,此时可用DateTime
  • “明天下午5点开视频会”,此时则需要大家都在同一时刻上线远程会议,可能有些地方的是白天,有些则在黑夜,此时可用DateTimeOffset。
目录
打赏
0
4
5
2
255
分享
相关文章
【Azure Function】C#独立工作模式下参数类型 ServiceBusReceivedMessage 无法正常工作
Cannot convert input parameter 'message' to type 'Azure.Messaging.ServiceBus.ServiceBusReceivedMessage' from type 'System.String'.
125 73
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
251 0
一个包含了 50+ C#/.NET编程技巧实战练习教程
一个包含了 50+ C#/.NET编程技巧实战练习教程
166 18
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
122 12
C#/.NET/.NET Core拾遗补漏合集(24年12月更新)
C#/.NET/.NET Core拾遗补漏合集(24年12月更新)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
126 5
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
190 13
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等