奇特的 JavaScript 日期比较输出

Peculiar JavaScript date comparison output

本文关键字:比较 输出 日期 JavaScript      更新时间:2023-09-26

有人可以解释为什么从一个JavaScript日期中减去另一个JavaScript日期(两个日期都设置为午夜)并不总是返回一致的结果吗?

例如,请参阅以下内容:

// the number of milliseconds in 1 day ...
var msInDay = 1000 * 60 * 60 * 24; 
// this line returns 1, as I would expect, as there is 1 day between the 2 dates ...
// (26th March and 27th March)
var days1 = (new Date(2016, 2, 27) - new Date(2016, 2, 26)) / msInDay;
// but this line returns 0.9583333333333334
// (27th March and 28 March)
var days2 = (new Date(2016, 2, 28) - new Date(2016, 2, 27)) / msInDay;

为什么 days2 == 1 不也?

Javascript(实际上是 ECMAScript)Date 对象使用时间值 UTC。使用 Date 构造函数创建日期对象时,在创建时间值时会考虑系统时区偏移量,以便将其偏移量与特定日期的时区偏移量相抵消。

如果要计算两个日期之间的天数而没有夏令时错误,请通过直接设置 UTC 时间值来绕过时区偏移量,例如

var days = (new Date(Date.UTC(2016, 2, 28)) - new Date(Date.UTC(2016, 2, 27))) / 8.64e7;
document.write(days);

或者,如果夏令时是两个时区之间的唯一差异,则只需舍入返回值。

编辑

如果只需要天数差异,则:

(Date.UTC(2016, 2, 28) - Date.UTC(2016, 2, 27)) / 8.64e7

就足够了。

附言。不应使用 en-gb 等语言指示符来表示时区。"区域设置"也是不恰当的,因为它指的是由地理特征或居住地定义的通常很小的区域,而时区通常是非常大的区域,大致基于经度线,除了它们可能与行政边界重合的地方之外,没有参考地理。