日期、时间和时区

除基本 DateTime 结构外,.NET 还提供以下支持处理时区的类型:

  • TimeZone

    使用此类处理系统的本地时区和协调世界时 (UTC) 区域。 TimeZone 类的功能在很大程度上可由 TimeZoneInfo 类取代。

  • TimeZoneInfo

    此类可用于处理系统上预定义的任何时区、创建新时区,以及将日期和时间从一个时区轻松转换成另一个时区。 对于新的开发,使用 TimeZoneInfo 类而不使用 TimeZone 类。

  • DateTimeOffset

    使用此结构处理已知 UTC 偏移量(或差值)的日期和时间。 DateTimeOffset 结构结合了日期和时间值与该时间的 UTC 偏移量。 由于其与 UTC 间的关系,单独的日期和时间值可以明确地识别单个时间点。 这使 DateTimeOffset 值比 DateTime 值更容易从一台计算机移植到另一台计算机。

从 .NET 6 开始,可用类型如下:

  • DateOnly

    当使用只表示日期的值时,请使用此结构。 该日期表示从一天开始到结束的一整天。 DateOnly 的范围为 0001-01-019999-12-31。 此类型表示不含具体时间的年、月、日组合。 如果以前在代码中使用了 DateTime 类型来表示已省略时间的日期,请在相应位置使用此类型。

  • TimeOnly

    使用此结构来表示不含日期的时间。 此时间表示不含具体日期的小时、分钟和秒。 TimeOnly 的范围为 00:00:00.000000023:59:59.9999999。 当使用 DateTimeTimeSpan 类型来表示时间时,此类型可用于在代码中替换这些类型。

下一部分提供处理时区和创建时区识别应用程序所需的信息,时区识别程序可将日期和时间从一个时区转换到另一时区。

本节内容

时区概述
介绍了创建时区感知应用程序时所涉及的术语、概念和问题。

在 DateTime、DateTimeOffset、TimeSpan 和 TimeZoneInfo 之间进行选择
讨论在处理日期和时间数据时何时使用 DateTimeDateTimeOffsetTimeZoneInfo 类型。

查找本地系统上定义的时区
介绍了如何枚举在本地系统上找到的时区。

如何:枚举计算机上的时区
举例介绍了如何枚举在计算机注册表中定义的时区,以及如何允许用户在列表中选择预定义时区。

如何:访问预定义的 UTC 和本地时区对象
介绍了如何访问协调世界时和本地时区。

如何:实例化 TimeZoneInfo 对象
介绍如何从本地系统注册表中实例化 TimeZoneInfo 对象。

实例化 DateTimeOffset 对象
讨论实例化 DateTimeOffset 对象的方式,以及可将 DateTime 值转化为 DateTimeOffset 值的方法。

如何:创建不带调整规则的时区
介绍了如何创建不支持夏令时转换规则的自定义时区。

如何:创建带有调整规则的时区
介绍了如何创建支持一个或多个夏令时转换规则的自定义时区。

保存和还原时区
介绍了 TimeZoneInfo 提供的时区数据序列化和反序列化支持,并通过一些应用场景介绍了如何使用这些功能。

如何:将时区保存到嵌入的资源中
介绍了如何创建自定义时区,并将其信息保存到资源文件中。

如何:从嵌入的资源还原时区
介绍了如何实例化已保存到嵌入的资源文件的自定义时区。

使用日期和时间执行算术运算
讨论加上、减去和比较 DateTimeDateTimeOffset 值时会出现的问题。

如何:在日期和时间算术中使用时区
介绍了如何执行反映时区调整规则的日期和时间算术。

在 DateTime 与 DateTimeOffset 之间进行转换
介绍了如何在 DateTimeDateTimeOffset 值之间转换。

在不同时区之间转换时间
介绍了如何将时间从一个时区转换成另一个时区。

如何:解析不明确时间
介绍了如何通过将不明确时间映射到时区的标准时间来解析不明确时间。

如何:让用户解析不明确时间
介绍了如何让用户确定不明确本地时间与协调世界时之间的映射。

参考

System.TimeZoneInfo