29

以毫秒为单位计算自(最后一个)午夜以来经过的时间的最佳方法是什么?

4

7 回答 7

39

使用当前日/月/年创建一个新日期,并获取差异。

var now = new Date(),
    then = new Date(
        now.getFullYear(),
        now.getMonth(),
        now.getDate(),
        0,0,0),
    diff = now.getTime() - then.getTime(); // difference in milliseconds
于 2012-06-08T07:05:15.797 回答
36

一堆答案,所以这里有另一个:

var d = new Date(), e = new Date(d);
var msSinceMidnight = e - d.setHours(0,0,0,0);

作为一个函数:

function getMsSinceMidnight(d) {
  var e = new Date(d);
  return d - e.setHours(0,0,0,0);
}

alert(getMsSinceMidnight(new Date()));
于 2012-06-08T09:25:51.847 回答
11

除了RobG's (recommended answer)Kolink'sLai's之外的许多答案在这里都是错误的

让我们一起仔细看看


第一个错误

OptimusCrimeAndrew D.回答:

正如Mala所建议的那样,如果夏令时校正是在最近的午夜应用的,我们会得到不正确的值。让我们调试:

  1. 假设是三月的最后一个星期日
  2. 时间固定在凌晨 2 点。
  3. 如果我们在时钟上看到上午 10 点,实际上从午夜过去了 11 个小时
  4. 但相反,我们计算10 * 60 * 60 * 1000ms
  5. 当午夜发生在与当前不同的 DST 状态时,就会播放这个技巧

第二个错误

肯尼贝克的回答:

正如RobG所写,如果您两次获得系统时间,时钟就会滴答作响。我们有时甚至可以出现在不同的日期。您可以在循环中重现它:

for (var i = 0; true; i++) {
    if ((new Date()).getTime() - (new Date()).getTime()) {
        alert(i); // console.log(i);  // for me it's about a 1000
        break;
    }
}

第三是你可能会遇到的我个人的陷阱

考虑以下代码:

var d = new Date(),
    msSinceMidnight = d - d.setHours(0,0,0,0);

msSinceMidnight总是0在减法运算之前的计算过程中改变对象


最后,这段代码有效:

var d = new Date(),
    msSinceMidnight = d.getTime() - d.setHours(0,0,0,0);
于 2013-04-03T16:28:44.920 回答
6

如果您不介意创建两个日期,则编写起来更简单。

var msSinceMidnight= new Date()-new Date().setHours(0,0,0,0);
于 2012-06-08T11:29:05.590 回答
2
var d=new Date();
// offset from midnight in Greenwich timezone
var msFromMidnightInGMT=d%86400000;
// offset from midnight in locale timezone
var msFromMidnightLocale=(d.getTime()-d.getTimezoneOffset()*60000)%86400000;
于 2012-06-08T07:28:52.130 回答
0
var today = new Date();
var d = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0, 0); 

var difference = today.getTime() - d.getTime();
于 2012-06-08T07:07:04.160 回答
0

从午夜开始的秒数只是显示时间,但不是使用小时:分钟:秒,而是将所有内容转换为秒。

我认为应该这样做:

var now = new Date();    
var hours = now.getHours()*(60*60);
var minutes = now.getMinutes()*60;
var seconds = now.getSeconds();

var secSinceMidnight = hours+minutes+seconds;
于 2012-06-08T07:07:46.313 回答