你如何获得JavaScript的时间戳?

我怎样才能在JavaScript中获得时间戳?

类似Unix的时间戳,也就是代表当前时间和date的单个数字。 可以是数字或string。

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 

我也喜欢这个,因为它与现代浏览器一样短,并且兼容,超过357人投票认为它更好:

 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(); 

我在这个答案中提供了多种解决scheme和描述。
如果有任何不清楚的地方,请随时提问
ps:可悲的是,有人把这个问题合并到最高的答案,而没有给予信贷。


快速和肮脏的解决scheme:

 Date.now() /1000 |0 

警告 :如果你使用|0魔法,它可能会在2038年中断,并返回负数。 使用Math.floor()而不是那个时间

Math.floor()解决scheme:

 Math.floor(Date.now() /1000); 

Derek朕会功夫的一些书呆子替代scheme取自这个答案下面的评论:

 new Date/1e3|0 

Polyfill得到Date.now()工作:

让它在IE中工作,你可以做到这一点(来自MDN的 Polyfill):

 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 ) 

当然,它会打破夏时制,但取决于你正在build设的这可能是有用的,如果你需要做的时间戳二进制操作int32将在2038年后中断

这也将返回负值,但只有当你正在运行你的代码的个人电脑的用户正在改变他的电脑的时钟至less去年12月31日。


如果你只是想知道代码运行到第一时间的相对时间,你可以使用类似这样的东西:

 var relativeTime = (function () { var start = Date.now(); return function () { return Date.now() - start } })(); 

如果你正在使用jQuery,你可以使用jQuery的Docs中描述的$.now() ,这使得Polyfill过时了,因为它们是这样做的: (new Date).getTime()

如果你只是对jQuery的版本感到高兴,考虑upvoting 这个答案,因为我没有find它自己。


现在是一个很小的解释|0

通过提供| 你告诉解释器做二进制OR操作。
位操作需要绝对数字,将Date.now() / 1000的十进制结果转换为绝对数字。
在这个转换过程中,小数点被删除,导致与使用Math.floor()相同的结果,但使用较less的代码。

要注意的是:它会将64位双精度转换为32位整数。
处理大量数据会导致信息丢失。
由于int32溢出,时间戳将在2038年后中断。


有关Date.now的更多信息,请参阅此链接: Date.now()@ MDN

 var timestamp = Number(new Date()); // current time as number 

jQuery提供了自己的方法来获取时间戳:

 var timestamp = $.now(); 

(除了它只是实现(new Date).getTime()expression式)

REF: http : //api.jquery.com/jQuery.now/

只是加起来,这里有一个函数返回一个JavaScript中的时间戳string。 例如:15:06:38 PM

 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; } 
 console.log(new Date().valueOf()); // returns the number of milliseconds since the epoch 

除了其他选项,如果你想要一个dateformat ISO,你可以直接得到它

 console.log(new Date().toISOString()); 

一个我还没有看到

 Math.floor(Date.now() / 1000) // current time in seconds 

另一个我还没有看到的是

 var _ = require('underscore'); // from here http://underscorejs.org/#now 

要么

 var _ = require('lodash'); // from here https://lodash.com/docs#now 

然后

 _.now(); 

Date.getTime()方法可以使用一点点的调整:

getTime方法返回的值是1970年1月1日00:00:00 UTC以来的毫秒数。

将结果除以1000以获得Unix时间戳,如有必要,

 (new Date).getTime() / 1000 

Date.valueOf()方法在function上等同于Date.getTime() ,这使得可以在date对象上使用算术运算符来实现相同的结果。 在我看来,这种方法影响可读性。

这里有一个简单的函数来生成格式为: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()))); } 

代码Math.floor(new Date().getTime() / 1000)可以缩短为new Date / 1E3 | 0 new Date / 1E3 | 0

考虑跳过直接的getTime()调用并使用| 0 | 0代替Math.floor()函数。 同样值得注意的是, 1E31000的较短等价物(大写的E比小写字母更好,表示1E3是一个常数)。

结果你得到以下结果:

 var ts = new Date / 1E3 | 0; document.write(ts); 
 // 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> 

对于微秒分辨率的时间戳,有performance.now

 function time() { return performance.now() + performance.timing.navigationStart; } 

这可以产生1436140826653.139 ,而Date.now只能给出1436140826653

我强烈build议使用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的方法,请参阅他们的文档

你只能使用

  var timestamp = new Date().getTime(); console.log(timestamp); 

任何不支持的浏览器Date.now,您可以使用此获取当前date时间:

 currentTime = Date.now() || +new Date() 

这个有一个解决scheme:它将unixtime stamp转换为js中的tim,试试这个

 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 ); 

我们的团队正在使用它来在本地主机环境中进行caching。 输出是/dist/css/global.css?v=245521377其中245521377是由hrtime()生成的时间戳。

希望这有帮助,上面的方法可以工作,但我发现这是最简单的方法来满足我们在Node.js中的需求。

JavaScript中的Date本地对象是我们获取所有关于时间的数据的方式。 在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(); 

我学会了一种非常酷的方式,将date对象从JQuery Cookie源代码转换为Unix时间戳。

这是一个例子:

 var date = new Date(); var timestamp = +date; 

对于lodash和下划线用户,请使用_.now

 var timestamp = _.now(); // in milliseconds 

这似乎工作。

 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可以抽象出处理Javascriptdate的很多痛苦。

请参阅: http : //momentjs.com/docs/#/displaying/unix-timestamp/

 moment().unix(); 

更简单的方法:

 var timeStamp=event.timestamp || new Date().getTime(); 

build议,正确的方法是Number(new Date()) ,在代码可读性方面,

另外,UglifyJS和Google-Closure-Compiler将降低parsing代码逻辑树的复杂性(如果你使用其中的一个来隐藏/缩小你的代码)。

对于时间分辨率较低的Unix时间戳,只需将当前的数字除以1000

有时我需要在xmlhttp调用的对象中,所以我喜欢这样做。

 timestamp : parseInt(new Date().getTime()/1000, 10) 

var my_timestamp = ~~(Date.now()/1000);