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读取memcache示例分享
Jan 02 NodeJs
nodejs获取本机内网和外网ip地址的实现代码
Jun 01 NodeJs
nodejs初步体验篇
Nov 23 NodeJs
Nodejs中的this详解
Mar 26 NodeJs
详解NodeJs支付宝移动支付签名及验签
Jan 06 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
深入nodejs中流(stream)的理解
Mar 27 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
nodejs body-parser 解析post数据实例
Jul 26 NodeJs
nodeJS微信分享
Dec 20 NodeJs
nodejs简单访问及操作mysql数据库的方法示例
Mar 15 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 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
php的header和asp中的redirect比较
2006/10/09 PHP
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
详解YII关联查询
2016/01/10 PHP
用javascript实现自动输出网页文本
2015/07/30 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
jQuery获取访问者IP地址的方法(基于新浪API与QQ查询接口)
2016/05/25 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
jQuery如何跳转到另一个网页 就这么简单
2016/12/28 Javascript
Vue.js父与子组件之间传参示例
2017/02/28 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
python3编写C/S网络程序实例教程
2014/08/25 Python
使用Python编写Linux系统守护进程实例
2015/02/03 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
浅析python的优势和不足之处
2018/11/20 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
微软新西兰官方网站:Microsoft New Zealand
2018/08/17 全球购物
YII2 全局异常处理深入讲解
2021/03/24 PHP
英语商务邀请函范文
2014/01/16 职场文书
黄河的主人教学反思
2014/02/07 职场文书
创先争优活动方案
2014/02/12 职场文书
《木笛》教学反思
2014/03/01 职场文书
技能比武方案
2014/05/21 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
消防演习感想
2015/08/10 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
创业计划书之珠宝饰品
2019/08/26 职场文书
Centos环境下Postgresql 安装配置及环境变量配置技巧
2021/05/18 PostgreSQL
mybatis-plus模糊查询指定字段
2022/04/28 Java/Android