nodejs如何获取时间戳与时间差


Posted in NodeJs onAugust 03, 2016

Nodejs中获取时间戳的方法有很多种,例如:

    1.new Date().getTime()

    2.Date.now()

    3.process.uptime()

    4.process.hrtime()

平时想获取一个时间戳的话,用这些方法都可以,那么这些方法有什么区别呢?

new Date().getTime()和Date.now()

这些方法是通过node运行环境的系统时间毫秒数, +new Date() 写法的效果和 new Date().getTime() 效果相同。

在需要频繁使用时间戳的场景中,需要关注方法性能,这几种方法中 Date.now() 的性能最佳,可以通过一点代码来测试:

var t1 = new Date().getTime();
var t2 = t1;
var i = 0, count = 10000000, interval = 0;

for(i = 0; i < count; i++)
{
  t2 = new Date().getTime();
  interval = (t2 - t1);
}
interval = (t2 - t1);
console.log('【new Date().getTime()】interval: ', interval);

t1 = new Date().getTime();
for(i = 0; i < count; i++)
{
  t2 = +new Date;
  interval = (t2 - t1);
}
interval = (t2 - t1);
console.log('【+new Date】interval: ', interval);

t1 = new Date().getTime();
for(i = 0; i < count; i++)
{
  t2 = Date.now();
  interval = (t2 - t1);
}
interval = (t2 - t1);
console.log('【Date.now()】interval: ', interval);

输出结果:

【new Date().getTime()】interval: 1583

【+new Date】interval: 2189

【Date.now()】interval: 891

如果只是获取时间戳,那么使用Date.now()是最佳的做法,但是如果要计算时间差,这几个方法就会有点问题:运行环境的系统时间有时候是会有微小回调的,这样得到的时间差就不精确了,有时候会引发某些BUG。

process.hrtime()

这种方式是根据任意取的一个过去的时间点,距离现在的时间来获取一个精确的时间戳对象:[秒, 纳秒]

> process.hrtime()
[ 3197146, 563552237 ]

这种方式和系统时间无关,因此不会受到系统时钟漂移的影响,用来计算时间差的时候就不会有BUG了。

但是,万事总有但是 - -

如果用在一个被频繁调用的地方呢?

var t1 = new Date().getTime();
var t2 = t1;
var i = 0, count = 10000000, interval = 0;

var hrTime1 = process.hrtime();
var hrTime2 = hrTime1;

t1 = new Date().getTime();
for(i = 0; i < count; i++)
{
  hrTime2 = process.hrtime(hrTime1);
}
t2 = new Date().getTime();
interval = parseInt(hrTime2[0] * 1e3 + hrTime2[1] * 1e-6);
console.log('【hrTime】interval: ', interval, t2 - t1);

【hrTime】interval: 6412 6413 没有记错的话,相同的创建次数,上面的Date.now()可是900ms左右啊!

process.hrtime()也太慢了有木有!!!

原来nodejs处理高精度时间的时候,计算比较复杂,占用系统资源多,速度慢,那么在高频应用的地方就不适合用这个方法了。下面请看process.uptime()

process.uptime()

此函数是通过nodejs启动运行时间来得到一个秒数时间戳,精确到毫秒:

process.uptime

输入:6.419

此函数以node启动时间为准,同样也不会受系统时钟漂移影响,适合用来计算时间差。

那么多次调用性能如何呢?

var t1 = new Date().getTime();
var t2 = t1;
var i = 0, count = 10000000, interval = 0;

t1 = process.uptime()*1000;
for(i = 0; i < count; i++)
{
  t2 = process.uptime()*1000;
  //interval = (t2 - t1);
}
interval = (t2 - t1);
console.log('【process.uptime()】interval: ', interval);

输出:【process.uptime()】interval: 954

process.hrtime()相比性能就搞出很多了~

不用算那么精确,就是快!

那么需要高频计算时间差的场合,就是你了!

以上就是nodejs获取时间戳与时间差的全部内容,希望对大家平时使用nodejs的时候能有所帮助。

NodeJs 相关文章推荐
nodejs中实现sleep功能实例
Mar 24 NodeJs
浅析nodejs实现Websocket的数据接收与发送
Nov 19 NodeJs
用nodejs的实现原理和搭建服务器(动态)
Aug 10 NodeJs
NodeJS仿WebApi路由示例
Feb 28 NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
Mar 24 NodeJs
nodejs爬虫遇到的乱码问题汇总
Apr 07 NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
nodejs前端模板引擎swig入门详解
May 15 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
nodejs使用async模块同步执行的方法
Mar 02 NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 #NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 #NodeJs
nodejs加密Crypto的实例代码
Jul 07 #NodeJs
Nodejs中 npm常用命令详解
Jul 04 #NodeJs
Nodejs全局安装和本地安装的不同之处
Jul 04 #NodeJs
NodeJs——入门必看攻略
Jun 27 #NodeJs
浅析Nodejs npm常用命令
Jun 14 #NodeJs
You might like
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
Javascript的IE和Firefox兼容性汇编(zz)
2007/02/02 Javascript
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
使用plupload自定义参数实现多文件上传
2016/07/19 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
详解vue axios中文文档
2017/09/12 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
python调用java的Webservice示例
2014/03/10 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
python+flask实现API的方法
2018/11/21 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
Python中 Global和Nonlocal的用法详解
2020/01/20 Python
python实现遍历文件夹图片并重命名
2020/03/23 Python
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
2015/09/11 面试题
广告传媒专业应届生求职信
2014/03/01 职场文书
公司口号大全
2014/06/11 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
大学生感恩父母演讲稿
2014/08/28 职场文书
个人诉讼委托书范本
2014/10/17 职场文书
幼儿园六一儿童节演讲稿
2015/03/19 职场文书
小学运动会入场口号
2015/12/24 职场文书
redis实现共同好友的思路详解
2021/05/26 Redis
Redis RDB技术底层原理详解
2021/09/04 Redis
关于nginx 实现jira反向代理的问题
2021/09/25 Servers
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android