首页 > 解决方案 > 日期字符串转换浏览器与夏令时的区别

问题描述

我有 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 : Sun Feb 23 1975 01:00:00 GMT-0600 (Central Standard Time)

1975 年 2 月 23 日凌晨 2 点

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

IE : Sun Feb 23 1975 02:00:00 GMT-0600 (Central Standard Time)

1975 年 4 月 6 日凌晨 1 点

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

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

1975 年 4 月 6 日凌晨 2 点 铬: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 点

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

IE : Sun Apr 06 1975 03:00:00 GMT-0500 (CDT)

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

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

标签: javascriptdatedatetimedst

解决方案


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

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

要专门回答您帖子中的两个问题:

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

2:因为 Richard Nixon 在 1974 年和 1975 年臭名昭著地规定了全年夏令时。出现您正在测试的 IE 版本根据当时的执行任务处理 DST,而 Chrome 根据当前准则以一致的格式应用它.

幸运的是 MomentJS 和 MomentTimezone 可以处理所有这些变化:moment.js 浏览器是否独立?

这些是任何与日期/时间相关的基本 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 中并查看控制台,它会为您工作。玩得开心!


推荐阅读