本文有助于修复以下问题:在对 64 位版本的 Windows 7 或 Windows Server 2008 R2 进行就地升级后,受影响计算机上的显示时间与当前本地时间不匹配的问题。
原始 KB 数: 2001086
现象
假设出现了下面这种情景:
安装 64 位版本的 Windows Vista、Windows 7 或 Windows Server 2008 R2。
将时区设置为以色列标准时间。 在 Windows Vista 中,这显示为耶路撒冷时间(GMT+02:00)。 在 Windows 7 和 Windows Server 2008 R2 上,这显示为 耶路撒冷(UTC+02:00)。
你可以就地升级到 64 位版本的 Windows 7 或 Windows Server 2008 R2。
预期行为:
升级后,已正确配置时区设置,动态 DST 等功能将继续工作。
观察到的行为:
升级后,GetDynamicTimeZoneInformation() API 无法识别当前时区。 如果没有用户干预来更正此问题,动态 DST 将中断,并且计算机不会根据未来几年的正确日期调整 DST。 因此,受影响计算机上的显示时间与当前本地时间不匹配。
出现此问题时,用户不会收到有关错误的通知。
其他 Windows Server 2008 R2 问题
在 Windows Server 2008 R2 服务器上,无法更改时区设置,并且收到以下错误消息:
无法识别当前时区。 请选择有效的时区。
原因
TimeZoneKeyName 注册表设置定义为 128 WCHAR REG_SZ数据类型。 如果 TimeZoneKeyName 中的第 128 个 WCHAR 不是 null 终止符,则系统升级过程(Offline.xml)会将 null 追加到字符串中。 这将长度增加到 129 个 WCHAR。 由于 Windows 有一个用于存储此数据的 128 WHCAR 缓冲区,因此系统不会从注册表加载修改后的字符串。
此问题适用于升级到 64 位 Windows 7 和 Windows Server 2008 R2。
其他 Windows Server 2008 R2 原因
以下注册表子项的非工作服务器上缺少权限:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
和 HKLM\System\CurrentControlSet\Control\TimeZoneInformation
解决方法
在 Windows Server 2008 R2 计算机上,在 控制面板 或 Windows 任务栏上启动日期和时间项。 如果时钟窗口中的消息指示时区无法识别,请单击“ 更改时区”,验证时区设置,然后按 “确定”。 这会将正确的值还原到 TimeZoneKeyName。 在 Windows 7 客户端上,在安装 OOBE 阶段验证时区选择。 这会还原 注册表中的 TimeZoneKeyName 设置。
注意
- Windows 操作系统在内部使用 UTC 时间执行依赖于时间的操作。 显示在 Windows 任务栏或控制面板项中显示的时间基于 UTC 时间加上或减去根据本地计算机时区区域设置更正的夏令时规则的区域时间偏移量。
- 此 bug 不会影响 Windows 使用的内部系统时间。 这可能会导致显示的时间不正确。
- 在“日期和时间”项中更正时间设置时,请首先验证是否已配置正确的时区。 在进行任何日期或小时更改之前执行此操作,以免无意中配置不正确的系统时间。
详细信息
动态 DST
在某些国家/地区,DST 日期因年份而异,不能由单个规则定义。 因此,Windows 包含用于在注册表中存储每年规则的动态 DST 功能。 当年份发生更改时,将使用该年份的正确 DST 信息刷新当前时区信息。
动态 DST 依赖于以下注册表值设置为动态 DST 数据所在的时区键的名称(例如,“以色列标准时间”):
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\TimeZoneKeyName
仅影响不同年份(动态 DST)具有不同规则的时区。 这是因为注册表值指示存储这些每年规则的位置已损坏。 如果缺少此值,则明年的更改期间不会刷新时区信息数据。 这会导致使用上一年的 DST 规则来计算本地时间。 系统版本升级后,显示时间不会受到此问题的影响。 单击任务栏时钟或在控制面板中打开“日期和时间”项时,将收到无法识别时区的通知。
如果时区未更正,则将来转换到 DST 或从 DST 转换可能在错误的时间发生。 这会导致系统上出现不正确的时间,或者系统与本地时间之间的转换不正确。
所有时区都可能会受到影响,但主要影响操作系统安装,这些安装配置为使用包含动态 DST 数据的区域。 支持动态 DST 的时区如下所示:
阿拉斯加标准时间
阿拉伯 (Arabic) 标准时间
阿根廷标准时间
大西洋标准时间
澳大利亚东部标准时间
中部 澳大利亚标准时间
巴西中部标准时间
中部标准时间
E. 南美洲标准时间
东部标准时间
埃及标准时间
格陵兰标准时间
伊朗标准时间
以色列标准时间
毛里求斯标准时间
蒙得维的亚标准时间
摩洛哥标准时间
山地标准时间
新西兰标准时间
纽芬兰标准时间
太平洋南美洲标准时间
太平洋标准时间
巴基斯坦标准时间
巴拉圭标准时间
塔斯马尼亚岛标准时间
委内瑞拉标准时间
西 澳大利亚标准时间
在这种情况下的影响更大的原因是,时区的 DST 数据可能不会更新,以反映应在给定年份生效的规则。 这可能会导致转换到 DST 或从 DST 在给定时区中的错误时间发生。 如果时区中不存在动态 DST,则这不是问题。 但是,损坏的注册表数据会导致对 GetDynamicTimeZoneInformation() 的任何调用失败,而不考虑时区是否支持动态 DST。