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服务器(2):nodejs服务器的构成分析
Dec 18 NodeJs
基于nodejs 的多页面爬虫实例代码
May 31 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
nodejs 图解express+supervisor+ejs的用法(推荐)
Sep 08 NodeJs
Nodejs实现文件上传的示例代码
Sep 26 NodeJs
nodejs发送http请求时遇到404长时间未响应的解决方法
Dec 10 NodeJs
Nodejs中crypto模块的安全知识讲解
Jan 03 NodeJs
nodejs express配置自签名https服务器的方法
May 22 NodeJs
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
Oct 17 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 NodeJs
nodejs读取图片返回给浏览器显示
Jul 25 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 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
神族 Protoss 历史背景
2020/03/14 星际争霸
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
EasyUI实现第二层弹出框的方法
2015/03/01 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
js中获取时间new Date()的全面介绍
2016/06/20 Javascript
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
2020/10/28 Javascript
Python中的文件和目录操作实现代码
2011/03/13 Python
安装dbus-python的简要教程
2015/05/05 Python
numpy中以文本的方式存储以及读取数据方法
2018/06/04 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
python删除某个目录文件夹的方法
2020/05/26 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
CSS3中设置3D变形的transform-style属性详解
2016/05/23 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
2014/09/09 面试题
教师求职推荐信范文
2013/11/20 职场文书
中学家长会邀请函
2014/02/03 职场文书
《泉水》教学反思
2014/04/11 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
社区科普工作方案
2014/06/03 职场文书
药剂专业自荐书
2014/06/20 职场文书
微笑服务标语
2014/06/24 职场文书
学校个人对照检查材料
2014/08/26 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
2015年小学开学寄语
2015/02/27 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
详解redis分布式锁的这些坑
2021/05/19 Redis