以毫秒为单位计算自(最后一个)午夜以来经过的时间的最佳方法是什么?
问问题
24449 次
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's和Lai's之外的许多答案在这里都是错误的
让我们一起仔细看看
第一个错误
正如Mala所建议的那样,如果夏令时校正是在最近的午夜应用的,我们会得到不正确的值。让我们调试:
- 假设是三月的最后一个星期日
- 时间固定在凌晨 2 点。
- 如果我们在时钟上看到上午 10 点,实际上从午夜过去了 11 个小时
- 但相反,我们计算
10 * 60 * 60 * 1000
ms - 当午夜发生在与当前不同的 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 回答