有人可以解释为什么从另一个中减去一个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;
为什么天2 = = 1?
答案 0 :(得分:2)
Javascript(实际上是ECMAScript)日期对象使用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
就足够了。
PS。 像en-gb这样的语言指示符不应该用于表示时区。 “地区”也是不合适的,因为它指的是由地理特征或居住地定义的一般小区域,而时区通常是非常大的区域,大致基于经度线,除了它们可能与之重合的地方之外没有任何地理参考。行政边界。