gpt4 book ai didi

javascript - 不同浏览器上的不同行为

转载 作者:行者123 更新时间:2023-11-30 09:17:41 25 4
gpt4 key购买 nike

让以下代码片段:

var dateJS = new Date("1950-09-09T23:00:00.000Z");
var dateMoment = moment("1950-09-09T23:00:00.000Z");

console.log("Javascript Epoch Time:", dateJS.valueOf());
console.log("Moment Epoch Time:", dateMoment.valueOf());
console.log("Is DST?", dateMoment.isDST());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>

如果您使用某些 Firefox 版本(例如 Firefox 61.0.1)或 Microsoft Edge 运行它,您将获得 Is DST? true 。相反,如果您使用其他一些 Firefox 版本(例如 64.0)或任何 Chrome 运行它,您会得到 Is DST? false .

可能是什么原因?

新片段:

var mar1947 = moment("1947-03-20T00:00:00.000Z");
var sep1947 = moment("1947-09-10T00:00:00.000Z");
var mar1950 = moment("1950-03-20T00:00:00.000Z");
var sep1950 = moment("1950-09-10T00:00:00.000Z");
var mar2019 = moment("2019-03-20T00:00:00.000Z");
var sep2019 = moment("2019-09-10T00:00:00.000Z");

console.log("March 1947: Epoch Time / DST:", mar1947.valueOf(), mar1947.isDST());
console.log("September 1947: Epoch Time / DST:", sep1947.valueOf(), sep1947.isDST());
console.log("March 1950: Epoch Time / DST:", mar1950.valueOf(), mar1950.isDST());
console.log("September 1950: Epoch Time / DST:", sep1950.valueOf(), sep1950.isDST());
console.log("March 2019: Epoch Time / DST:", mar2019.valueOf(), mar2019.isDST());
console.log("September 2019: Epoch Time / DST:", sep2019.valueOf(), sep2019.isDST());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>

请先使用 Chrome 运行该代码段,然后使用 Firefox 61.0.1 或 Microsoft Edge 运行该代码片段,看看结果是否相同。

不会。

(这里有完整的 Playground https://codepen.io/anon/pen/yZMqrV )

最佳答案

“MomentJS 浏览器独立吗?”问题的答案可能是“不”。从某一时刻获取长日期可能取决于您使用的浏览器。这同样会影响 Javascript 的 Date 对象。

该问题与世界上每个国家/地区的历史 DST 应用程序以及历史时区偏移有关,直到最新版本的 ECMAScript 才观察到这种情况。因此,旧版浏览器(例如 Firefox 61.0.1 和 Microsoft Edge)无法正确覆盖全局各个不同地点的 DST 规则。

要解决这个问题,你必须使用 MomentJS 的 .utc() 方法(如 VincenzoC 在我的回答中的评论)。

因此,以下代码适用于每个浏览器:它始终返回相同的时间(纪元时间),并且每次都会“规范化”DST(它始终为 false):

var mar1947 = moment("1947-03-20T00:00:00.000Z").utc().startOf('day');
var sep1947 = moment("1947-09-10T00:00:00.000Z").utc().startOf('day');
var mar1950 = moment("1950-03-20T00:00:00.000Z").utc().startOf('day');
var sep1950 = moment("1950-09-10T00:00:00.000Z").utc().startOf('day');
var mar2019 = moment("2019-03-20T00:00:00.000Z").utc().startOf('day');
var sep2019 = moment("2019-09-10T00:00:00.000Z").utc().startOf('day');

console.log("March 1947:", mar1947.valueOf(), mar1947.isDST());
console.log("September 1947:", sep1947.valueOf(), sep1947.isDST());
console.log("March 1950:", mar1950.valueOf(), mar1950.isDST());
console.log("September 1950:", sep1950.valueOf(), sep1950.isDST());
console.log("March 2019:", mar2019.valueOf(), mar2019.isDST());
console.log("September 2019:", sep2019.valueOf(), sep2019.isDST());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>

请注意,如果您在其他方法之后(而不是之前)使用此方法,例如 startOf() (请参阅 github 上的相关问题)

在这里您可以使用一些 Playground :Codepen1 , Codepen2

关于javascript - 不同浏览器上的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53957981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com