不同浏览器上的不同行为

sma*_*use 2 javascript date epoch dst momentjs

让以下片段:

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());
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

如果您使用某些 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());
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

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

它不会。

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

sma*_*use 5

问题“MomentJS 浏览器是否独立?”的答案 可能是“否”。从 Moment 日期获取 Long 可能取决于您使用的浏览器。这同样会影响DateJavascript 的对象。

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

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

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

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());
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

请注意,如果您在其他方法之后(而不是之前)使用此方法,则它无法正常工作,例如startOf()(参见github上的相关问题)

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