虚拟化时区

适用于:Windows Server 2025、Windows Server 2022、Windows Server 2019、

Windows 容器支持维护独立于主机的虚拟化时区配置的功能。 传统上用于主机时区的所有配置都已虚拟化,并为每个容器实例化。 借助此功能,Windows 容器提供以下行为:

  • 启动容器时,将继承主机的时区并保留在容器中。 如果主机的时区在容器运行时发生更改,则存储在容器中的时区不会更改。 若要重新继承主机的时区,必须重启容器。
  • 容器会保留主机的时区配置,仅在用户从容器中显式配置时区后,才会在启动容器时观察到该配置。 从容器中设置时区后,配置将虚拟化,容器不再引用主机。
  • 如果配置容器的时区,并随后保存容器的状态,则时区配置会在重新启动时保留。

与系统时区配置相关的所有内核模式和用户模式 API 现在都是容器感知的。 当在容器上下文中运行的线程调用系统 API 来查询本地时间时,它会检索容器的时区配置,而不是主机的时区配置。 从容器中写入的时区数据现在保留在特定于容器的存储中,相关的容器在启动时不再继承主机的当前时区数据。 这意味着,设置时区后,容器将继续在重新启动时使用配置的时区。 只要在其中一个层中显式设置时区配置,则在映像基础之上构建的任何容器都会继承该配置。

下表列出了每个 SKU 所支持的版本:

SKU 支持的内部版本
Windows Server 2019 10.0.17763.1935 或更高版本
20H2 SAC 10.0.19042.985 或更高版本
Windows Server 2022 所有版本
Windows Server 2025 所有版本

如何配置容器的时区?

首先,需要同时拥有包含此功能的主机和客户机版本,这意味着要在 2105B 服务补丁或更高版本上运行。 运行早期版本只是将容器的行为还原为镜像主机时区,配置不会影响主机或来宾。

注意

配置时区需要管理权限,特别是 SeTimeZonePrivilege。 ContainerAdministrator 帐户具有此权限。 因此,建议使用工作负荷所需的最低权限运行,并为管理任务保留 ContainerAdministrator 帐户,例如设置时区。

配置容器时区的建议方法是通过 TZUtil.exe 实用工具或 PowerShell 的 Set-TimeZone cmdlet。 这些实用工具维护良好,为轻松设置时区提供了便利。 任何其他方法都需要直接与系统 API 交互。 带有 TZUtil.exe 或 PowerShell 的基本映像版本将开箱即用。 Nanoserver 基础映像是一个例外,因为此映像默认不支持 TZUtil.exe 或 PowerShell,因此需要自定义实用工具才能与系统 API 交互。 在任何情况下,新编写的应用程序不应依赖于操作系统时区 除非绝对必要,而是应在应用程序数据和逻辑中考虑它。

使用 Windows Server 2019 的示例

使用 Windows Server 2019 Server Core 基础映像,下面是设置虚拟化时区的示例。

  1. 启动容器后,将时区设置为主机的时区(在此示例中,它是太平洋标准时间),如下所示:

    PS C:\> tzutil /g
    Pacific Standard Time
    
    
  2. 主机的时区 设置为中亚标准时间(UTC+6:00),并注意到太平洋标准时间仍显示在容器中:

    PS C:\> Get-TimeZone
    
    Id                         : Pacific Standard Time
    DisplayName                : (UTC-08:00) Pacific Time (US & Canada)
    StandardName               : Pacific Standard Time
    DaylightName               : Pacific Daylight Time
    BaseUtcOffset              : -08:00:00
    SupportsDaylightSavingTime : True
    

    请注意,首次启动容器时,配置将被设定为创建基础映像 时的状态,直到您自行配置。 在大多数情况下,对于 Windows 基础映像,默认值为太平洋标准时间。

  3. 接下来,将容器的时区设置为“萨摩亚标准时间”:

    PS C:\> tzutil /s "Samoa Standard Time"
    PS C:\> tzutil /g
    Samoa Standard Time
    PS C:\> Get-TimeZone
    
    Id                         : Samoa Standard Time
    DisplayName                : (UTC+13:00) Samoa
    StandardName               : Samoa Standard Time
    DaylightName               : Samoa Daylight Time
    BaseUtcOffset              : 13:00:00
    SupportsDaylightSavingTime : True
    

    现在容器的时区已更新为萨摩亚标准时间,但主机仍保留在中亚标准时间。 保存容器的状态时,此配置会保留。

  4. 如果重启容器而不以前保存其状态,时区将设置为主机的时区,如下所示:

    PS C:\>tzutil /g
    Central Asia Standard Time
    PS C:\> Get-TimeZone
    
    Id                         : Central Asia Standard Time
    DisplayName                : (UTC+06:00) Astana
    StandardName               : Central Asia Standard Time
    DaylightName               : Central Asia Daylight Time
    BaseUtcOffset              : 06:00:00
    SupportsDaylightSavingTime : False