在某些版本的 Windows 10 上,通过 Microsoft Edge 更新永久禁用已停用的不支持的 Internet Explorer 11 桌面应用程序。 有关详细信息,请参阅 Internet Explorer 11 桌面应用停用常见问题解答

本文介绍从标准时间转换为夏令时 (DST) 的错误报告,并提供解决方案。

原始产品版本: Internet Explorer 11、Internet Explorer 10、Internet Explorer 9
原始 KB 编号: 2410734

在某些情况下, JavaScript Date 使用 对象计算日期时,用户可能会看到明显不正确的结果。 如果满足以下条件,则会发生此行为:

  • 日期和时间 设置 中配置的时区在午夜从标准时间转换为 DST。
  • 日期算术使用 Date 没有小时和分钟 (或使用 0) 的小时和分钟的对象,并且仅使用从标准时间转换到 DST 的日期。
  • 例如,尝试构造 Date 10/17/2010 会产生 10/16 的日期:

    var dt = new Date(2010, 9,17);
    // ...
    console.log(dt.toString()); // evaluates to 'Sat Oct 16 23:00:00 UTC-0300 2010'
    dt.getDate(); // evaluates to 16
    

    这是当对象初始化到 DST 开始的时间时 Date() 发生的问题的特定实例。

    用于构造 Date 对象的值表示标准时间结束点之后的时间,但早于本地时钟将在 DST 开始后显示。 欧洲计算机制造商协会脚本 (ECMAScript) 语言规范指定在计算时间值(对象的内部表示形式 Date )时减去 1 小时的 DST 调整。 但是,这最终表示 DST 开始之前的一段时间。 在巴西,这种情况发生在午夜,因此对象 Date 最终表示前一天的时间。

    此行为符合 ECMAScript 标准,因此是设计使然。

    如果只关注日、月和年,则可以通过使用不为零的小时值(即安全大于夏令时调整的小时值)构造日期对象来解决此问题。

    ECMAScript 标准可在 ECMAScript® 2016 语言规范中找到。

    第 20.3.2 节 定义如何解释日期构造函数,包括将时间值转换为协调世界时 (UTC) 的事实。

    第 20.3.1.10 节 定义了本地时间和 UTC 时间之间的转换,并指出这些转换不一定是相互反转的。

    此转换的公式如下:

    UTC( t ) = t - LocalTZA - DaylightSavingTA(t - LocalTZA)
    

    如果在 DST 开始时遵循此步骤,可以看到如何减去小时。 此示例针对太平洋时间,因此实际日期不会更改。 开头为:

    t = <Sun Mar 13 02:00:00 Pacific 2011>
    LocalTZA = -8
    The expression t - LocalTZA occurs twice in this equation; it evaluates to <Sun Mar 13 10:00:00 UTC 2011>. This is the exact moment when DST starts in the Pacific time zone. This is the key fact during conversion of this time to UTC:
    UTC( <Sun Mar 13 02:00:00 Pacific 2011> )
    = <Sun Mar 13 02:00:00 Pacific 2011> - LocalTZA - DaylightSavingTA( <Sun Mar 13 02:00:00 Pacific 2011> - LocalTZA )
    = <Sun Mar 13 10:00:00 UTC 2011> -DaylightSavingTA( <Sun Mar 13 10:00:00 UTC 2011> )
    = <Sun Mar 13 10:00:00 UTC 2011>- 1
    = <Sun Mar 13 9:00:00 UTC 2011>