nodejs中获取时间戳、时间差
Nodejs中获取时间戳的方法有很多种,例如:
new Date().getTime()
Date.now()
process.uptime()
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()相比性能就搞出很多了~
不用算那么精确,就是快!
那么需要高频计算时间差的场合,就是你了!
测试代码地址:https://github.com/zouchengzhuo/nodejsLearn/tree/master/getTime
本文转自我的个人站点:http://zoucz.com/blog/2016/06/28/nodejs-get-time/
【end】
nodejs中获取时间戳、时间差的更多相关文章
- js与es6中获取时间戳
在项目中经常会用到求时间戳的问题,下面是已经封装好的函数,直接使用就可以.1.js常用获取时间戳的方法 // 获取时间戳 var start = new Date().getTime(); conso ...
- [转载]C#中获取时间戳(UnixTime)的方法
.Net中没有封装获取时间戳(UnixTime,相对于1970年1月1日凌晨的毫秒数)的方法.因此本人写了如下方法实现. 提醒在摸索中的朋友,注意方法中的四舍五入.关于讨论四舍五入的方法,可以在这里找 ...
- Nodejs中获取参数以及处理参数
先看题干效果 在这里我们建了一个表单 填入表单需要提交的信息 对两个参数进行获取和一个加法计算 表单html代码 <form action='http://localhost:8080' met ...
- C#中获取时间戳
{ 注意:下面是以毫秒为单位的13位 UTC 时间戳(非正规) }//先取得当前的UTC时间,然后转换成计算用的周期数(简称计时周期数),每个周期为100纳钞(ns)=0.1微秒(us)=0.00 ...
- js中获取时间戳
function conver(){ var date = new Date(); var year = date.getFullYear() var month=date.getMonth()+1; ...
- [转] node.js如何获取时间戳与时间差
[From] http://www.jb51.net/article/89767.htm Nodejs中获取时间戳的方法有很多种,例如: 1.new Date().getTime() 2.Date. ...
- 在C#中获取如PHP函数time()一样的时间戳
原文:在C#中获取如PHP函数time()一样的时间戳 c#中没有象PHP一样的time()时间戳函数,但有DateTime.Now.Ticks用来计算时间差. 此属性的值为自 0001 年 1 月 ...
- nodejs之获取客户端真实的ip地址+动态页面中引用静态路径下的文件及图片等内容
1.nodejs获取客户端真实的IP地址: 在一般的管理网站中,尝尝会需要将用户的一些操作记录下来,并记住是哪个用户进行操作的,这时需要用户的ip地址,但是往往当这些应用部署在服务器上后,都使用了ng ...
- nodejs中命令行中参数的获取和解析
首先,假设有如下的命令行 node abc.js arg1 arg2 arg3,现在想在abc.js中获取后面的参数arg1.arg2.arg3… var args = process.argv.s ...
随机推荐
- 关于Unity3D自定义编辑器的学习
被人物编辑器折腾了一个月,最终还是交了点成品上去(还要很多优化都还么做). 刚接手这项工作时觉得没概念,没想法,不知道.后来就去看<<Unity5.X从入门到精通>>中有关于 ...
- C++ std::set
std::set template < class T, // set::key_type/value_type class Compare = less<T>, // set::k ...
- excel 日期/数字格式不生效需要但双击才会生效的解决办法
原因: Excel2007设置过单元格格式后,并不能立即生效必须挨个双击单元格,才能生效.数据行很多.效率太低. 原因:主要是一些从网上拷贝过来的日期或数字excel默认为文本格式或特殊-中文数字格式 ...
- Ubuntu 16.10 开启PHP错误提示
两个步骤: 修改php.ini配置文件中的error_reporting 和 display_errors两地方内容: sudo vim /etc/php/7.0/apache2/php.ini er ...
- CRL快速开发框架系列教程十二(MongoDB支持)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 工行ICBC_WAPB_B2C支付接口
一. 前期准备 手机银行(WAP)B2C在线支付接口说明V1.0.0.6.doc 手机银行移动生活商户及门户网站js接口API.doc 支付组件ICBCEBankUtil.dll和infosecapi ...
- MongoDB学习笔记四—增删改文档下
$slice 如果希望数组的最大长度是固定的,那么可以将 $slice 和 $push 组合在一起使用,就可以保证数组不会超出设定好的最大长度.$slice 的值必须是负整数. 假设$slice的值为 ...
- 第14章 Linux启动管理(2)_启动引导程序grub
2. 启动引导程序grub 2.1 Grub配置文件 (1)grub中分区的表示 硬盘 分区 Linux设备文件名 Grub中设备文件名 第1块SCSI硬盘 第1个主分区 /dev/sda1 hd(0 ...
- Windows 上安装 Jekyll.
Jekyll是一个静态网站生成工具.它允许用户使用HTML.Markdown或Textile来建立静态页面,然后通过模板引擎Liquid(Liquid Templating Engine)来运行. 原 ...
- UML类图(下):关联、聚合、组合、依赖
前言 上一篇文章UML类图(上):类.继承.实现,讲了UML类图中类.继承.实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联.聚合.组合.依赖, ...