日期、时间和时区

.NET 提供表示日期、时间和时区的类型。 本文介绍这些类型。

除了基本 DateTime 结构之外,.NET 还提供支持使用时区的以下类:

  • TimeZoneInfo

    使用这个类来处理系统上预定义的任何时区,创建新的时区,并轻松地将日期和时间从一个时区转换到另一个时区。 对于新开发,请使用 TimeZoneInfo 类而不是 TimeZone 类。

  • DateTimeOffset

    使用此结构处理已知 UTC 偏移量(或差值)的日期和时间。 DateTimeOffset 结构将日期和时间值与该时间相对于 UTC 的偏移量结合在一起。 由于它与 UTC 的关系,单个日期和时间值明确标识单个时间点。 这使得 DateTimeOffset 值比 DateTime 值更可移植到另一台计算机。

以下类支持处理时间:

  • TimeSpan

    使用此结构表示时间间隔,例如经过的时间量或两个日期之间的差异。

  • TimeOnly

    使用此结构表示没有日期的时间。 时间表示非特定日期的小时、分钟和秒。 TimeOnly 的范围是从 00:00:00.000000023:59:59.9999999。 当你使用这些类型来表示时间时,此类型可用于替换代码中的 DateTimeTimeSpan 类型。 有关详细信息,请参阅 如何使用 DateOnly 和 TimeOnly 结构

    重要

    TimeOnly 不适用于 .NET Framework。

  • TimeProvider

    这是提供时间抽象的基类。 检查当前时间的一种常见方法是使用 DateTime.UtcNowDateTimeOffset.UtcNow。 但是,这些类型没有提供对被视为“现在”的内容的任何控制。为什么要控制这一点呢? 可测试性。 例如,请考虑编写事件跟踪应用程序,该应用程序在事件前 1 天提供提醒。 应用的逻辑是每小时检查事件时间,并在事件发生前 24 小时通知用户。 在为应用编写测试时,你会提供一个自定义类型来封装 DateTimeOffset.UtcNow 从而测试此逻辑,但现在 .NET 已为你提供了这个抽象类。

    有关详细信息,请参阅什么是 TimeProvider

    TimeProvider 类型包含在 .NET 中。

    对于 .NET Framework 和 .NET Standard,TimeProviderMicrosoft.Bcl.TimeProvider NuGet 包提供。

以下类支持处理日期:

  • DateOnly

    处理仅表示日期的值时,请使用此结构。 日期表示从一天开始到结束的整天。 DateOnly 的范围是 0001-01-019999-12-31。 并且,这种类型表示月份、日和年组合,没有特定的时间。 如果以前在代码中使用了 DateTime 类型来表示忽略时间的日期,请在其位置使用此类型。 有关详细信息,请参阅 如何使用 DateOnly 和 TimeOnly 结构

    重要

    DateOnly 不适用于 .NET Framework。

下一部分将提供您需要的信息,以便使用时区并创建能够处理时区转换的应用程序,这些应用程序可以将日期和时间从一个时区转换为另一个时区。

本节内容

时区概述
讨论创建时区感知应用程序的术语、概念和问题。

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

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

如何枚举计算机上存在的本地时区
提供了一些示例,这些示例枚举计算机注册表中定义的时区,并允许用户从列表中选择预定义的时区。

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

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

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

如何:创建不调整规则的时区
介绍如何创建自定义时区,该时区不支持夏令时的启用和退出。

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

保存和还原时区
描述 TimeZoneInfo 对时区数据的序列化和反序列化的支持,并说明了可使用这些功能的一些场景。

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

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

使用日期和时间执行算术运算
讨论添加、减去和比较 DateTimeDateTimeOffset 值所涉及的问题。

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

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

在时区之间转换时间
介绍如何将时间从一个时区转换为另一个时区。

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

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

参考文献

System.TimeZoneInfo