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)
问题“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
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |