该 TimeZoneInfo 类简化了时区感知应用程序的创建。 该 TimeZone 类支持使用本地时区和协调世界时(UTC)。 TimeZoneInfo 类支持这两个区域以及注册表中预定义信息的任何时区。 还可以用于 TimeZoneInfo 定义系统没有信息的自定义时区。
时区概要
时区是使用同一时间的地理区域。 通常,但并非总是,相邻时区相隔一小时。 世界上任一时区的时间都能以与协调世界时 (UTC) 之间的时差表示。
世界上许多时区都支持夏令时。 夏令时通过在春季或初夏将时间向前调整一小时,随后在夏末或秋季恢复到正常(或标准)时间,来最大化白昼时间。 这种针对标准时间的来回更改就称为调整规则。
特定时区进入和退出夏令时的转换可以通过固定或浮动调整规则来定义。 固定调整规则设置每年转换到夏令时或从夏令时转换的特定日期。 例如,每年10月25日从夏令时过渡到标准时间遵循固定的调整规则。 更常见的是浮动调整规则,这些规则为过渡到夏令时或从夏令时转换设置特定月份的特定星期的特定日期。 例如,从标准时间到夏令时的过渡发生在 3 月的第三个星期日,这遵循一个浮动调整规则。
对于实施调整规则的时区而言,夏令时的来回转换会导致两种反常时间:无效时间和不明确时间。 无效时间是指,从标准时间转换到夏令时而产生的不存在的时间。 例如,如果此转换发生在上午 2:00 的特定日期,并导致时间更改为 3:00 A.M.,则每个介于 2:00 A.M. 和 2:59:59 A.M 之间的时间间隔无效。 不明确时间是指一个时区内可映射到两个不同时间的时间。 它是由从夏令时过渡到标准时间创建的。 例如,如果此转换发生在上午 2:00 的特定日期,并导致时间更改为 1:00 A.M.,则每个时间间隔在 1:00 A.M. 和 1:59:59 A.M 之间都可以解释为标准时间或夏令时。
时区术语
下表定义了使用时区和开发时区感知应用程序时常用的术语。
术语 | 定义 |
---|---|
调整规则 | 一个规则,用于定义何时从标准时间过渡到夏令时,以及从夏令时转换回标准时间的时间。 每个调整规则都有一个开始和结束日期,用于定义规则的落实时间(例如,调整规则从 1986 年 1 月 1 日到 2006 年 12 月 31 日)、增量(根据调整规则应用标准时间而更改的时间量),以及有关调整期间转换的具体日期和时间的信息。 转换可以遵循固定规则或浮动规则。 |
歧义时间 | 一个时区内可映射到两个不同时间的时间。 在向后调整时钟时间时,例如从时区的夏令时调整到标准时间这段转换期间,便会出现不明确时间。 例如,如果此转换发生在上午 2:00 的特定日期,并导致时间更改为 1:00 A.M.,则每个时间间隔在 1:00 A.M. 和 1:59:59 A.M 之间都可以解释为标准时间或夏令时。 |
固定规则 | 该调整规则设定发生夏令时来回转换的特定日期。 例如,每年10月25日从夏令时过渡到标准时间遵循固定的调整规则。 |
浮动规则 | 该规则设定在特定月特定星期的某一天发生夏令时来回转换。 例如,从标准时间到夏令时的过渡发生在 3 月的第三个星期日,这遵循一个浮动调整规则。 |
无效时间 | 从标准时间转换到夏令时而导致产生的不存在的时间。 这种情况发生在时钟的时间被向前调整时,例如在从时区的标准时间过渡到夏令时期间。 例如,如果此转换发生在上午 2:00 的特定日期,并导致时间更改为 3:00 A.M.,则每个介于 2:00 A.M. 和 2:59:59 A.M 之间的时间间隔无效。 |
过渡时间 | 有关特定时间更改的信息,例如在特定时区中从夏令时更改为标准时间,反之亦然。 |
时区和 TimeZoneInfo 类
在 .NET 中,对象 TimeZoneInfo 表示时区。 该 TimeZoneInfo 类包括一个 GetAdjustmentRules 返回对象数组 TimeZoneInfo.AdjustmentRule 的方法。 此数组的每个元素都提供有关在特定时间段内转换到夏令时和从夏令时转换的信息。 (对于不支持夏令时的时区,该方法返回空数组。每个 TimeZoneInfo.AdjustmentRule 对象都有一 DaylightTransitionStart 个和一个 DaylightTransitionEnd 属性,用于定义转换到夏令时和从夏令时转换的特定日期和时间。 该 IsFixedDateRule 属性指示该转换是固定转换还是浮动转换。
.NET 依赖于 Windows作系统提供的时区信息,并存储在注册表中。 由于地球时区的数目,并非所有现有时区都在注册表中表示。 此外,由于注册表是一种动态结构,因此可以向其中添加或删除预定义时区。 最后,注册表不一定包含历史时区数据。 例如,在 Windows XP 中,注册表仅包含一组时区调整的数据。 Windows Vista 支持动态时区数据,这意味着单个时区可以有多个适用于特定年份间隔的调整规则。 但是,在 Windows Vista 注册表中定义的大多数时区都只支持夏令时一两个预定义的调整规则。
类对注册表的 TimeZoneInfo 依赖意味着时区感知应用程序不能确定注册表中定义了特定时区。 因此,尝试实例化特定时区(本地时区或表示 UTC 的时区除外)应使用异常处理。 如果无法从注册表实例化所需 TimeZoneInfo 对象,它还应提供让应用程序继续的一些方法。
为了处理缺少必需的时区,该 TimeZoneInfo 类包含一种方法 CreateCustomTimeZone ,可用于创建自定义时区,这些时区在注册表中找不到。 有关创建自定义时区的详细信息,请参阅 如何:创建不带调整规则的时区 和 如何:创建带调整规则的时区。 此外,还可以使用 ToSerializedString 该方法将新创建的时区转换为字符串,并将其保存在数据存储(例如数据库、文本文件、注册表或应用程序资源) 中。 然后可以使用 FromSerializedString 方法将此字符串转换回 TimeZoneInfo 对象。 有关详细信息,请参阅 如何:将时区保存到嵌入资源中 和 如何:从嵌入资源中恢复时区。
由于每个时区均由与 UTC 之间的基本时差表示,同时也可由与反映任何现有调整规则的 UTC 之间的时差表示,因此,可轻易将一个时区内的时间转换为另一时区的时间。 为此,该 TimeZoneInfo 对象包括多个转换方法,包括:
ConvertTimeFromUtc,它将 UTC 转换为指定时区中的时间。
ConvertTimeToUtc,用于将指定时区中的时间转换为 UTC。
ConvertTime,它将一个指定时区中的时间转换为另一个指定时区中的时间。
ConvertTimeBySystemTimeZoneId,它使用时区标识符(而不是 TimeZoneInfo 对象)作为参数,将一个指定时区中的时间转换为另一个指定时区中的时间。
有关在时区之间转换时间的详细信息,请参阅 时区之间的转换时间。