在某些版本的 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>