如何在 JavaScript 中获取时间戳?
-
03-07-2019 - |
题
如何在 JavaScript 中获取时间戳?
类似于 Unix 的时间戳,即表示当前时间和日期的单个数字。作为数字或字符串。
解决方案
简短&时髦:
+ new Date()
plus
之类的一元运算符会触发 Date
对象中的 valueOf
方法,并返回时间戳(不做任何更改)。
<强>详细信息:强>
在几乎所有当前浏览器上,您都可以使用 Date.now()
以毫秒获取UTC时间戳;一个值得注意的例外是IE8及更早版本(参见兼容性表)
你可以很容易地为此做一个垫片:
if (!Date.now) {
Date.now = function() { return new Date().getTime(); }
}
要在秒中获取时间戳,您可以使用:
Math.floor(Date.now() / 1000)
或者您也可以使用:
Date.now() / 1000 | 0
哪个应该稍快一些,但也不太可读(同时请参阅这个答案)。
我建议使用 Date.now()
(兼容shim)。它稍微好一点,因为它更短和更短不会创建新的 Date
对象。但是,如果你不想要垫片和垫片。最大兼容性,您可以使用“旧”获取时间戳的方法毫秒:
new Date().getTime()
然后您可以将其转换为秒:
Math.round(new Date().getTime()/1000)
您还可以使用我们在上面显示的 valueOf
方法:
new Date().valueOf()
以毫秒为单位的时间戳
var timeStampInMs = window.performance && window.performance.now && window.performance.timing && window.performance.timing.navigationStart ? window.performance.now() + window.performance.timing.navigationStart : Date.now();
console.log(timeStampInMs, Date.now());
其他提示
我喜欢这个,因为它很小:
+new Date
我也喜欢这个,因为它与现代浏览器一样简短并且兼容,超过500人投票表示它更好:
Date.now()
JavaScript使用自纪元以来的毫秒数,而大多数其他语言使用秒。您可以使用毫秒,但只要您传递一个值来表示PHP,PHP本机函数可能会失败。所以要确保我总是使用秒,而不是毫秒。
这将为您提供Unix时间戳(以秒为单位):
var unix = Math.round(+new Date()/1000);
这将为您提供自纪元以来的毫秒数(不是Unix时间戳):
var milliseconds = new Date().getTime();
var time = Date.now || function() {
return +new Date;
};
time();
我提供了多个解决方案,并在此答案中提供了说明。如果有任何不清楚的地方,请随时提问
PS:遗憾的是有人将此合并到最佳答案而没有给予信任。
快速而肮脏的解决方案:
Date.now() /1000 |0
警告 :如果您执行
| 0
可能在2038年中断并返回负数>魔术。到那时使用Math.floor()
Math.floor()
解决方案:
Math.floor(Date.now() /1000);
通过 Derek&#26389;&#26371;&#21151;&#22827; 获取的一些书呆子替代品评论如下:
new Date/1e3|0
Polyfill获取 Date.now()
工作:
要在IE中使用它,你可以这样做(Polyfill来自 MDN ):
if (!Date.now) {
Date.now = function now() {
return new Date().getTime();
};
}
如果您不关心周/夏令时的年/日,您可以将其剥离并在2038年后使用:
var now = (function () {
var year = new Date(new Date().getFullYear().toString()).getTime();
return function () {
return Date.now() - year
}
})();
它的外观输出:
new Date() Thu Oct 29 2015 08:46:30 GMT+0100 (Mitteleuropäische Zeit ) new Date(now()) Thu Oct 29 1970 09:46:30 GMT+0100 (Mitteleuropäische Zeit )
当然它会打破夏令时,但取决于你 正在构建这可能对你有用,如果你需要做二进制 int32之后的时间戳操作将在2038年中断。
这也将返回负值,但仅限于该PC的用户 你正在运行你的代码正在改变他们的PC时钟至少 去年12月31日。
如果你只是想知道从代码运行到第一次的相对时间,你可以使用这样的东西:
var relativeTime = (function () {
var start = Date.now();
return function () {
return Date.now() - start
}
})();
如果您使用的是jQuery,可以使用 $。now()
,如 jQuery的文档,这使得polyfill过时,因为 $。now()
在内部执行相同的操作:(new Date).getTime()
强>
如果您对jQuery的版本感到满意,请考虑提高 此 的答案,因为我没有找到它自己。
现在对 | 0
所做的一个小小的解释:
通过提供 |
,您告诉解释器执行二进制OR操作。位操作需要绝对数字,将小数结果从 Date.now()/ 1000
转换为整数。
在转换过程中,会删除小数,导致与使用 Math.floor()
相同的结果,但使用的代码更少。
请注意:它会将64位双精度转换为32位整数。这会在处理大量数据时导致信息丢失。由于32位整数溢出,时间戳将在2038年后中断。
有关 Date.now
的更多信息,请点击此链接: Date.now()
@ MDN
var timestamp = Number(new Date()); // current time as number
console.log(new Date().valueOf()); // returns the number of milliseconds since the epoch
只是加起来,这是一个在Javascript中返回时间戳字符串的函数。 例如:下午15:06:38
function displayTime() {
var str = "";
var currentTime = new Date()
var hours = currentTime.getHours()
var minutes = currentTime.getMinutes()
var seconds = currentTime.getSeconds()
if (minutes < 10) {
minutes = "0" + minutes
}
if (seconds < 10) {
seconds = "0" + seconds
}
str += hours + ":" + minutes + ":" + seconds + " ";
if(hours > 11){
str += "PM"
} else {
str += "AM"
}
return str;
}
除了其他选项之外,如果你想要一个dateformat ISO,你可以直接得到它
console.log(new Date().toISOString());
日期,JavaScript中的原生对象是我们获取所有时间数据的方式。
在JavaScript中要小心,时间戳取决于客户端计算机集,因此它不是100%准确的时间戳。要获得最佳结果,您需要从服务器端获取时间戳。
无论如何,我首选的方法是使用香草。这是在JavaScript中执行此操作的常用方法:
Date.now(); //return 1495255666921
在MDN中提到如下:
Date.now()方法返回自此以来经过的毫秒数 1970年1月1日00:00:00 UTC。
因为now()是Date的静态方法,所以总是将它用作Date.now()。
如果您使用ES5以下的版本, Date.now();
不起作用,您需要使用:
new Date().getTime();
我尚未见过
Math.floor(Date.now() / 1000); // current time in seconds
另一个我还没见过的是
var _ = require('lodash'); // from here https://lodash.com/docs#now
_.now();
Date.getTime()
方法可以使用一点点调整:
getTime方法返回的值是毫秒数 自1970年1月1日00:00:00 UTC。
将结果除以1000得到Unix时间戳, floor
:
(new Date).getTime() / 1000
Date.valueOf()
方法在功能上等同于 Date.getTime()
,这使得可以在date对象上使用算术运算符来实现相同的结果。在我看来,这种方法会影响可读性。
代码 Math.floor(new Date()。getTime()/ 1000)
可以缩短为 new Date / 1E3 | 0 代码>
考虑直接跳过 getTime ()
调用并使用 | 0
代替 Math .floor()
功能。
记住 1E3
是 1000
的较短等价物也是一件好事(大写E优于小写,表示 1E3
为常量)。
结果您得到以下内容:
var ts = new Date / 1E3 | 0;
console.log(ts);
我强烈建议您使用 moment.js
。要获得自UNIX纪元以来的毫秒数,请执行
moment().valueOf()
要获得自UNIX纪元以来的秒数,请执行
moment().unix()
你也可以像这样转换时间:
moment('2015-07-12 14:59:23', 'YYYY-MM-DD HH:mm:ss').valueOf()
我一直这样做。没有双关语。
在浏览器中使用 moment.js
:
<script src="moment.js"></script>
<script>
moment().valueOf();
</script>
有关详细信息,包括安装和使用MomentJS的其他方法,请参阅 docs
这是一个生成时间戳的简单函数,格式为:mm / dd / yy hh:mi:ss
function getTimeStamp() {
var now = new Date();
return ((now.getMonth() + 1) + '/' +
(now.getDate()) + '/' +
now.getFullYear() + " " +
now.getHours() + ':' +
((now.getMinutes() < 10)
? ("0" + now.getMinutes())
: (now.getMinutes())) + ':' +
((now.getSeconds() < 10)
? ("0" + now.getSeconds())
: (now.getSeconds())));
}
// The Current Unix Timestamp
// 1443534720 seconds since Jan 01 1970. (UTC)
// seconds
console.log(Math.floor(new Date().valueOf() / 1000)); // 1443534720
console.log(Math.floor(Date.now() / 1000)); // 1443534720
console.log(Math.floor(new Date().getTime() / 1000)); // 1443534720
// milliseconds
console.log(Math.floor(new Date().valueOf())); // 1443534720087
console.log(Math.floor(Date.now())); // 1443534720087
console.log(Math.floor(new Date().getTime())); // 1443534720087
// jQuery
// seconds
console.log(Math.floor($.now() / 1000)); // 1443534720
// milliseconds
console.log($.now()); // 1443534720087
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
您只能使用
var timestamp = new Date().getTime();
console.log(timestamp);
获取当前时间戳。无需做任何额外的事情。
对于具有微秒分辨率的时间戳,有 表现。现在代码>
:
function time() {
return performance.now() + performance.timing.navigationStart;
}
例如,这可以产生 1436140826653.139
,而 Date.now
仅提供 1436140826653
。
今天 - 2018.06.27我提供了纯js解决方案的时间比较。这对于想要以轻/高效方式获取/测量JS时间的人来说非常有用(例如,对于模拟,游戏等实时应用程序)。
在Chrome 67.0.3396.99(64位),Safari 11.0.3(13604.5.6),Firefox 59.0.2(64位)上的MacOs High Sierra 10.13.3上进行了测试。在下面的屏幕截图中,我展示了最快浏览器(Safari)的结果:
我观察 Date.now()
是获取所有三个浏览器的时间戳的最快方法。 Safari每秒运行19.2M,Firefox 16.1M,Chrome 7.8M。
new Date()* 1
对于Chrome(2.8M)和Firefox(2.6M)来说是最慢的。对于Safari(2.9M), Number(new Date())
最慢。
所以赢家JS代码是 Date.now()
,最快的浏览器是Safari(比Chrome快2倍)。
您可以在此处对您的机器进行测试: https://jsperf.com/timestamp-test-x 。
任何不支持Date.now的浏览器,您可以使用它来获取当前日期时间:
currentTime = Date.now() || +new Date()
这个有一个解决方案:在js中将unix时间戳转换为时间尝试此
var a = new Date(UNIX_timestamp*1000);
var hour = a.getUTCHours();
var min = a.getUTCMinutes();
var sec = a.getUTCSeconds();
如果想要一种在 Node.js 中生成时间戳的基本方法,那么这很有效。
var time = process.hrtime();
var timestamp = Math.round( time[ 0 ] * 1e3 + time[ 1 ] / 1e6 );
我们的团队正在使用它来破坏本地主机环境中的缓存。输出是 /dist/css/global.css?v=245521377
在哪里 245521377
是生成的时间戳 hrtime()
.
希望这会有所帮助,上面的方法也可以工作,但我发现这是满足我们 Node.js 需求的最简单方法。
这似乎有效。
console.log(clock.now);
// returns 1444356078076
console.log(clock.format(clock.now));
//returns 10/8/2015 21:02:16
console.log(clock.format(clock.now + clock.add(10, 'minutes')));
//returns 10/8/2015 21:08:18
var clock = {
now:Date.now(),
add:function (qty, units) {
switch(units.toLowerCase()) {
case 'weeks' : val = qty * 1000 * 60 * 60 * 24 * 7; break;
case 'days' : val = qty * 1000 * 60 * 60 * 24; break;
case 'hours' : val = qty * 1000 * 60 * 60; break;
case 'minutes' : val = qty * 1000 * 60; break;
case 'seconds' : val = qty * 1000; break;
default : val = undefined; break;
}
return val;
},
format:function (timestamp){
var date = new Date(timestamp);
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
var hours = date.getHours();
var minutes = "0" + date.getMinutes();
var seconds = "0" + date.getSeconds();
// Will display time in xx/xx/xxxx 00:00:00 format
return formattedTime = month + '/' +
day + '/' +
year + ' ' +
hours + ':' +
minutes.substr(-2) +
':' + seconds.substr(-2);
}
};
Moment.js 可以消除处理Javascript日期的许多痛苦。
请参阅: http://momentjs.com/docs/#/displaying/unix -timestamp /
moment().unix();
截至撰写本文时,最佳答案是9年,自那时以来发生了很多变化 - 尤其是,我们几乎普遍支持非黑客解决方案:
Date.now()
如果你想绝对肯定这不会在一些古老的(pre ie9)浏览器中破解,你可以把它放在支票后面,如下:
const currentTimestamp = (!Date.now ? +new Date() : Date.now());
这将返回自纪元时间以来的毫秒数,当然不是秒数。
更简单的方法:
var timeStamp=event.timestamp || new Date().getTime();
有时我需要在xmlhttp调用的对象中使用它,所以我喜欢这个。
timestamp : parseInt(new Date().getTime()/1000, 10)