类似于 Unix 的时间戳,它是代表当前时间和日期的单个数字。无论是数字还是字符串。
你如何在 JavaScript 中获得时间戳?
短而时髦:
+ new Date()
一元运算符 likeplus
触发对象中的valueOf
方法Date
并返回时间戳(没有任何更改)。
细节:
在几乎所有当前浏览器上,您都可以使用Date.now()
以毫秒为单位获取 UTC 时间戳;一个值得注意的例外是 IE8 及更早版本(请参阅兼容性表)。
不过,您可以轻松地为此制作一个垫片:
if (!Date.now) {
Date.now = function() { return new Date().getTime(); }
}
要以秒为单位获取时间戳,您可以使用:
Math.floor(Date.now() / 1000)
或者,您可以使用:
Date.now() / 1000 | 0
这应该稍微快一点,但可读性也较差。
(另请参阅this answer或this以及对按位运算符的进一步解释)。
我建议使用Date.now()
(与兼容性垫片)。它稍微好一点,因为它更短并且不会创建新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();
我在此答案中提供了多种带有描述的解决方案。如果有什么不清楚的,请随时提出问题
快速而肮脏的解决方案:
Date.now() /1000 |0
警告:如果您使用魔法,它可能会在 2038 年中断并返回负数
|0
。使用Math.floor()
,而不是由时间
Math.floor()
解决方案:
Math.floor(Date.now() /1000);
Derek 朕会功夫的一些书呆子替代品来自此答案下方的评论:
new Date/1e3|0
Polyfill 开始Date.now()
工作:
为了让它在 IE 中工作,你可以这样做(来自MDN 的Polyfill ):
if (!Date.now) {
Date.now = function now() {
return new Date().getTime();
};
}
如果您不关心年份/星期几/夏令时,您需要记住 2038 年之后的日期:
按位运算将导致使用 32 位整数而不是 64 位浮点数。
您需要正确使用它:
Math.floor(Date.now() / 1000)
如果您只想知道从代码第一次运行开始的相对时间,您可以使用以下方法:
const relativeTime = (() => {
const start = Date.now();
return () => Date.now() - start;
})();
如果您使用的是 jQuery,您可以$.now()
按照jQuery 文档中的说明使用,这会使 polyfill 过时,因为在$.now()
内部执行相同的操作:(new Date).getTime()
如果您只是对 jQuery 的版本感到满意,请考虑对这个答案进行投票,因为我自己没有找到它。
现在对什么|0
做了一个小小的解释:
通过提供|
,您可以告诉解释器进行二元 OR 运算。
位运算需要绝对数,将十进制结果从Date.now() / 1000
整数转换为整数。
在该转换过程中,小数被删除,导致与 usingMath.floor()
输出的结果相似。
但请注意:它会将 64 位双精度数转换为 32 位整数。
这在处理大量数字时会导致信息丢失。
由于 32 位整数溢出,时间戳将在 2038 年之后中断,除非 Javascript 在严格模式下移动到 64 位整数。
有关Date.now
点击此链接的更多信息:Date.now()
@ MDN