奇特的 JavaScript 日期比较输出
Peculiar JavaScript date comparison output
有人可以解释为什么从一个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 等语言指示符来表示时区。"区域设置"也是不恰当的,因为它指的是由地理特征或居住地定义的通常很小的区域,而时区通常是非常大的区域,大致基于经度线,除了它们可能与行政边界重合的地方之外,没有参考地理。
相关文章:
- 比较从函数和生成的日期对象
- 如何使用 node.js 比较两个 json 数组
- 在JavaScript中输出转义字符
- jQuery自定义验证比较多个输入的序列
- 如何在jQuery中将函数的输出分配给变量
- 反向字符串比较
- 比较两个值时出现JavaScript输出和控制流错误
- 比较 2 个数组以输出总整数
- 当字符串中存在空格时,字符串比较会给出错误的输出
- 奇特的 JavaScript 日期比较输出
- 处理异常:读取键并进行比较,然后输出,否则出错
- 比较2个ISO 8601时间戳和输出秒/分钟差
- 什么'这是比较Google Sheets中两列数据并使用Google脚本仅输出不匹配数据的最佳方法
- 改进阵列比较的Jasmine测试输出
- 将输入与每个id进行比较,并输出最匹配的id
- 比较两个字符串并输出两者相等的结果
- Javascript:在条件中比较函数和数组的输出
- Jquery自定义字符串比较函数输出百分比
- 比较a-z还是a-z,并使用switch JavaScript函数给出输出
- 如何比较只有输出部分在html和javascript