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中的非阻塞方法介绍
Jun 05 NodeJs
windows系统下简单nodejs安装及环境配置
Jan 08 NodeJs
使用upstart把nodejs应用封装为系统服务实例
Jun 01 NodeJs
基于NodeJS的前后端分离的思考与实践(二)模版探索
Sep 26 NodeJs
nodejs中实现sleep功能实例
Mar 24 NodeJs
NodeJS和BootStrap分页效果的实现代码
Nov 07 NodeJs
Nodejs中使用captchapng模块生成图片验证码
May 18 NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
nodejs require js文件入口,在package.json中指定默认入口main方法
Oct 10 NodeJs
nodejs二进制与Buffer的介绍与使用
Jul 11 NodeJs
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
May 30 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
解析CodeIgniter自定义配置文件
2013/06/18 PHP
php判断是否为json格式的方法
2014/03/04 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
Opacity.js
2007/01/22 Javascript
javascript 计算两个整数的百分比值
2009/12/26 Javascript
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
分享20个提升网站界面体验的jQuery插件
2014/12/15 Javascript
javascript实现rgb颜色转换成16进制格式
2015/07/10 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
2016/05/30 Javascript
js date 格式化
2017/02/15 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
详解Python如何生成词云的方法
2018/06/01 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
详解python tkinter 图片插入问题
2020/09/03 Python
详解CSS3:overflow属性
2020/11/17 HTML / CSS
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
电子商务专业个人的自我评价分享
2013/10/29 职场文书
财务会计专业求职信范文
2013/12/31 职场文书
2014年护士个人工作总结
2014/11/11 职场文书
岗位聘任报告
2015/03/02 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书