javascript - 日期字符串转换浏览器与夏令时的差异

标签 javascript date datetime dst

我有 2 个问题。

<强>1。关于浏览器中 JavaScript 的夏令时实现。

(输出来自 Chrome 浏览器)

var dt1 = new Date(1975, 1 , 23, 1, 0, 0);
dt1.toString(); // Sun Feb 23 1975 01:00:00 GMT-0600 (Central Standard Time)
dt1.toUTCString(); // Sun, 23 Feb 1975 07:00:00 GMT
dt1.getTime(); // 162370800000 

var dt2 = new Date(1975, 1 , 23, 2, 0, 0);
dt2.toString(); // Sun Feb 23 1975 03:00:00 GMT-0500 (Central Daylight Time)
dt2.toUTCString(); // Sun, 23 Feb 1975 08:00:00 GMT
dt2.getTime(); //162374400000

var dt3 = new Date(1975, 1 , 23, 3, 0, 0);
dt3.toString(); // Sun Feb 23 1975 03:00:00 GMT-0500 (Central Daylight Time)
dt3.toUTCString(); // Sun, 23 Feb 1975 08:00:00 GMT
dt3.getTime(); // 162374400000

对于日期对象 dt2dt3 ,观察所有值都相同。这很令人困惑。

<强>2。 Internet Explorer 的夏令时开始日期错误。

1975 年,夏令时从 1975 年 2 月 23 日凌晨 2:00 开始。 当我在 Chrome 和 IE 中为 1975 年 2 月 23 日凌晨 1 点、凌晨 2 点和 1975 年 4 月 6 日凌晨 1 点、2 点、3 点创建日期对象时...

1975 年 2 月 23 日凌晨 1 点

Chrome:1975 年 2 月 23 日星期日 01:00:00 GMT-0600(中部标准时间)

IE:1975 年 2 月 23 日星期日 01:00:00 GMT-0600(中部标准时间)

1975 年 2 月 23 日凌晨 2 点

Chrome:1975 年 2 月 23 日星期日 03:00:00 GMT-0500(中部夏令时间)

IE:1975 年 2 月 23 日星期日 02:00:00 GMT-0600(中部标准时间)

1975 年 4 月 6 日凌晨 1 点

Chrome:1975 年 4 月 6 日星期日 01:00:00 GMT-0500 (CDT)//165996000000

IE:1975 年 4 月 6 日星期日 01:00:00 GMT-0600 (CST)//165999600000。以毫秒为单位的时间也不同。

1975 年 4 月 6 日凌晨 2 点 Chrome:1975 年 4 月 6 日星期日 02:00:00 GMT-0500 (CDT)//165999600000

IE:Sun Apr 06 1975 01:00:00 GMT-0600 (CST)//165999600000。时间(以毫秒为单位)相同。

1975 年 4 月 6 日凌晨 3 点

Chrome:1975 年 4 月 6 日星期日 03:00:00 GMT-0500 (CDT)

IE:1975 年 4 月 6 日星期日 03:00:00 GMT-0500 (CDT)

在 1975 年的 IE 中,夏令时逻辑在 1975 年 4 月 6 日下午 2 点之后开始,而不是在 1975 年 2 月 23 日凌晨 2 点之后开始。 Chrome 工作正常。

涉及夏令时时,如何在所有浏览器中显示正确的日期字符串?

最佳答案

夏令时和时区是最糟糕的! :)

JavaScript 日期/时间在客户端运行时始终受到每个浏览器特性的影响。因此,即使 2 个用户使用相同的浏览器,也可能会根据他们的笔记本电脑设置而有所不同。

具体回答您帖子中的两个问题:

1:看起来您正在从遵守 DST 的中央时区访问 JavaScript,而 UTC 则不遵守。夏令时发生在凌晨 2 点,因此 dt1 将采用标准时间,因为当天晚上是凌晨 1 点,而 dt2 和 dt3 则采用标准时间,因为它们分别是凌晨 2 点和凌晨 3 点。这就是差异的原因。

2:因为理查德·尼克松 (Richard Nixon) 在 1974 年和 1975 年臭名昭著地强制执行了全年夏令时。您正在测试的 IE 版本似乎根据当时的行政命令处理 DST,而 Chrome 则以基于一致的格式应用它。根据当前的指导方针。

幸运的是,MomentJS 和 MomentTimezone 可以处理所有这些变化:Is moment.js browser independent?

这些是与日期/时间相关的任何内容的基本 JavaScript 库
https://momentjs.com/
https://momentjs.com/timezone/

最简单的开始方法是:

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"> </script>
<script>
    var now = moment();
    console.log(now.format());
    console.log(now.isDST());
</script>

您可以将其放入您的 bodytag 中并查看控制台,它将为您工作。玩得开心!

关于javascript - 日期字符串转换浏览器与夏令时的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53091650/

相关文章:

javascript - 访问模板生成的子元素

java - 如何使用带有嵌套 if-else 语句的 switch 语句输出日期

r - 选择后 data.frame 内的修改日期变为 <NA>

javascript - 使用 JavaScript 比较两个日期

javascript - 分配和删除点击事件

javascript - 如何将 d3 map 工具提示绑定(bind)到 Leaflet 的 popupPane?

mysql - 购买表的 AVG 间隔长度

Java - 创建没有时区的日历

mysql - 如何在 MySQL 中以分钟为单位计算耗时

javascript - 通过 Thunderbird 扩展进行文件系统操作