在不同的浏览器上表现出不同的行为

Moment different behaviour on different browsers

让下面的片段:

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 运行 代码段,看看结果是否相同。

不会。

(这里是完整的游乐场 https://codepen.io/anon/pen/yZMqrV

问题 "Is MomentJS browser independent?" 的答案可能是 "No"。 从瞬间获取长日期可能取决于您使用的浏览器。 同样影响 Javascript 的 Date 对象。

这个问题与世界上每个国家/地区的历史 DST 应用程序有关,然后与历史时区偏移有关,直到最新版本的 ECMAScript 才观察到。 如此旧的浏览器,例如 Firefox 61.0.1 和 Microsoft Edge 没有正确覆盖全球所有不同位置有效的 DST 规则。

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

因此,以下代码适用于每个浏览器:它始终 returns 同一时间(大纪元时间)并且每次 "normalizes" 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 上的相关问题)

在这里你可以使用一些游乐场:Codepen1, Codepen2