0

我正在尝试测量发送和接收 ajax 请求之间的时间,但它通常返回负值。
谁能解释这种奇怪的行为?

var before = 0;
var after = 0;
$.ajax({
    url: 'data.php',
    type: 'GET',
    beforeSend: function () {
        before = new Date().getMilliseconds();
    },
    success: function (data, textStatus, xhr) {
        after = new Date().getMilliseconds();
        console.log(after - before);
    },
});
4

2 回答 2

3

将其更改为:

beforeSend: function () {
    before = +new Date();
},
success: function (data, textStatus, xhr) {
    console.log(new Date() - before);
},

当前实现的问题是Date.getMilliseconds()返回给定日期时间的毫秒部分- 这是 0 到 999 [ MDN ] 之间的数字。但是您实际上想比较给定日期时间的“毫秒戳”——这就是 [ MDN ]的Date.valueOf()(或):Date.getTime()

valueOf方法将 Date 对象的原始值作为数字数据类型返回,即自 UTC 1970 年 1 月 1 日午夜以来的毫秒数。

但是,您可以省略这些调用,因为-操作首先尝试将其操作数转换为基元(如果它们是对象)。所以这...

console.log(new Date() - before);

... 将与 ... 处理相同

console.log(new Date().valueOf() - before);

由于将起点存储before为完整的 Date 对象没有什么意义,因此它被强制转换为原始值 - 使用+(一元加号)运算符。

于 2013-10-27T10:03:01.083 回答
0

Date.getTime()我认为你在和之间有点困惑Date.getMilliSeconds

getTime 定义为

返回指定日期的数值,作为自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数(之前的时间为负数)。

所以,这也可以正常工作

before = new Date().getTime();

用于测量执行时间的 MDN 示例使用此

var end, start;

start = new Date();
for (var i = 0; i < 1000; i++)
  Math.sqrt(i);
end = new Date();

console.log("Operation took " + (end.getTime() - start.getTime()) + " msec");
于 2013-10-27T10:10:56.400 回答