本文提供有关 Microsoft 对 leap second 的支持的信息。

适用于: Windows Server 2019, Windows Server 2016, Windows Server 2012 R2, Windows Server 2008 R2 Service Pack 1, Windows 10, 版本 2004, Windows 10, 版本 1909, Windows 10, 版本 1803, Windows 10, 版本 1709, Windows 7Service Pack 1
原始 KB 编号: 2722715

本文包含有关 Microsoft 对 leap second 的支持的信息。 闰秒是一秒的调整,它偶尔应用于协调世界时 (UTC) ,以保持其一天的时间接近平均太阳时间,或UT1。

Windows Server 2019 和Windows 10 2018 年 10 月更新在平台中确实支持 leap seconds。 但是,本文不严格适用于这些或更高版本的操作系统。 有关更多信息,请参阅:

  • Leap Second 公告
  • IT 专业人员的 Leap Second 验证
  • 适用于开发人员的 Leap Second 验证
  • (1) Windows

    关于 OS
    Windows 操作系统 (OS) 不单独处理 Leap second 处理。 例如,Windows OS 不支持采用以下格式的年份、月份、日期和时间信息:

    yyyy/mm/dd 08:59:60

    因此,2012/7/1 08:59:60 按 ISO 8601 格式处理为 2012/7/1 09:00:00。

    关于时间同步服务 (Windows 时间服务)
    Windows 时间服务不会实现闰闰秒,即使它通过 LEAP 指示器 (LI) 标志从 NTP 服务器传递到托管 Windows 时间服务的服务器以及从中同步的下层客户端。 Windows 时间同步服务 (W32Time) 不会插入闰闰秒,而是继续执行通常的时间同步过程。

    在上游 NTP 服务器(包括 W32time Server () )上引入񝭨秒后的短暂时间段内,上游 NTP 服务器与从中同步的 W32time 客户端之间的时差约为 1 秒。 W32time 客户端在随后从上游服务器同步时间时更正其本地时钟。

    有关详细信息,请参阅以下 Microsoft 知识库 (KB) 文章:

    909614 Windows 时间服务如何处理闰幊秒

    此外,在 Windows 时间服务中,并不总是可以防止发生边际时差(例如一秒)。 操作系统旨在处理时间变化。 Leap second 变体处理干净,允许不间断执行。 有关详细信息,请参阅以下 KB 文章:

    939322 支持边界,为高精度环境配置 Windows 时间服务

    关于群集服务,对于群集配置,它与操作系统相同:不执行 leap second 处理。

    (2) SQL Server 2000、2005、2008、2008 R2、2012 和 2014

    SQL Server不使用时间数据来管理内部操作,例如事务。 因此,即使由于闰秒而在系统时间发生一秒偏差,也不会影响SQL Server操作。 与 Windows OS 一样,SQL Server不会独立识别闰秒。

    请注意日期数据类型 (例如,datetime) 不支持秒值达到 60 的格式,例如 2012/7/1 08:59:60。 因此,如果建立连接以从支持 leap second 的 OS 上运行的应用程序SQL Server,并且 OS 尝试设置໷秒 (数据,其中第二个数据的值在日期数据类型的列和变量中为 60) ,则返回错误。 有关详细信息,请参阅以下“参考信息”部分。

    [示例]将 leap second 处理为SQL Server中的日期数据类型时

    create table leap_second(
    a int,
    b datetime,
    insert into [leap_second] values (1,convert(datetime,'2012/07/01 08:59:60'))
    select convert(datetime,'2012/07/01 08:59:60')
    select datediff(day,convert(datetime,'2012/07/01 08:59:60'),getdate())
    declare @b datetime
    set @b='2012/07/01 08:59:60'
    declare @c time
    set @c='08:59:60'
    declare @d datetime2
    set @d='2012/07/01 08:59:60'
    declare @e datetimeoffset 
    set @e='2012/07/01 08:59:60'
    消息 242、级别 16、状态 3、第 1 行
    由于从 varchar 数据类型转换为 datetime 数据类型,因此该值设置在范围之外。
    语句已结束。

    消息 242、级别 16、状态 3、第 1 行
    由于从 varchar 数据类型转换为 datetime 数据类型,因此该值设置在范围之外。

    消息 242、级别 16、状态 3、第 1 行
    由于从 varchar 数据类型转换为 datetime 数据类型,因此该值设置在范围之外。

    消息 242、级别 16、状态 3、第 3 行
    由于从 varchar 数据类型转换为 datetime 数据类型,因此该值设置在范围之外。

    消息 241、级别 16、状态 1、第 2 行
    转换过程在从字符串转换到日期和时间,或转换为两个字符串之一的过程中失败。

    消息 241、级别 16、状态 1、第 2 行
    转换过程在从字符串转换到日期和时间,或转换为两个字符串之一的过程中失败。

    消息 241、级别 16、状态 1、第 2 行
    转换过程在从字符串转换到日期和时间,或转换为两个字符串之一的过程中失败。

    (3) Exchange Server 2003、2007、2010 和 2013

    在Exchange Server中使用的时间包括由系统时钟测量的时间,以及计算为服务启动以来的已用时段的时间。 在使用系统时钟的处理中,Exchange 服务器无需识别闰闰秒即可运行。 另一方面, () 所涉及的时间段,尽管闰闰秒的插入出现一秒的差异,但即使在正常情况下,这种偏差也可能发生。 与 Windows OS 一样,Exchange Server旨在处理次要时间变化。 因此,Exchange Server操作不会受到影响。

    除了内部操作之外,iCalendar 格式的计划表示可以从外部接收 () 添加闰秒的时间值。 但是,当Exchange Server收到 iCalendar 格式的计划时,程序仅支持那些根据 RFC 5545 定义时间表示法的格式。 对于 leap second,秒表示法在 060 范围内受支持。 如果将大于 60 的数字指定为秒值,则会将其处理为无效格式,并且无法识别为正确的 iCalendar 格式。

    在 Outlook 中,60 秒被视为 0。 因此,2012/07/01 08:59:60 变为 2012/07/01 08:59:00。 这意味着最多有一分钟的偏差。 在这种情况下,电子邮件的接收顺序可能看起来有偏差,但否则不会对操作造成影响。

    有关详细信息,请参阅:

    2.2.36 [RFC5545] 第 3.3.12 节时间

    (4) Internet Information Services (IIS)

    闰秒在 IIS 中没有效果。

    (5) 其他

    在 Windows 中运行的应用程序通常使用系统时钟。 因此,无需考虑闰闰秒即可使用它们。

    但是,如果从自行管理时间且支持闰闰秒的应用程序或从支持闰秒的 OS 上运行的应用程序访问 Microsoft 产品,则可能会出现问题。 这是因为 Microsoft 产品无法识别闰幊秒。

    此外,应用程序不应依赖系统时间来单调增加。 相反,他们应该使用 GetTickCount64 () 函数读取当前刻度计数,即启动以来的时间(以毫秒为单位)。