在不同的浏览器时刻不同的行为

问题描述 投票:1回答:1

让下面的代码片段:

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)或微软边缘运行它,你会得到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浏览器,然后用火狐61.0.1或Microsoft边缘的片段,看看结果是一样的。

它不会。

(这里https://codepen.io/anon/pen/yZMqrV满操场)

javascript date momentjs dst epoch
1个回答
4
投票

该问题的答案“是独立MomentJS浏览器?”可能是“否”。从瞬间日期获取长期可能取决于你使用的浏览器。这同样影响的Javascript Date对象。

这个问题是关系到世界每一个国家的历史DST的应用程序,然后用历史的时区偏移,这些都没有,直到最新版本的ECMAScript的观察。所以老的浏览器,如Firefox 61.0.1和微软边缘没有的DST规则的权利覆盖在世界各地的各种不同位置的效果。

为了解决这个问题,你必须使用瞬间JS的.utc()方法(如我的答案文森佐的评论)。

所以,下面的代码工作在每一个浏览器:它总是返回相同的时间(大纪元)和它“正常化” 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());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>

请注意,如果你之后(而不是之前)等方法使用该方法不propertly工作,像startOf()(见github相关的问题)

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

© www.soinside.com 2019 - 2024. All rights reserved.