前言:最近在学习时频产品时钟对时协议,在学习NTP协议时一直对协议报文中的时间戳转换存在疑问,通过各种搜集资料、自我理解后终于对NTP时间戳有了一个具体的认识;发现现阶段网上的免费资料里对整个转换没有写的很仔细,导致理解比较难,接下来我针对我学习后的理解,详细地讲一下NTP时间戳是如何转换成UTC时间的。(若有不对的地方,欢迎指出,共同进步)

正文:

首先简单讲一下NTP协议,相信搜到这篇文章的对NTP是有一定了解的,想进一步对NTP中某些字段定义学习深入一点。NTP(Network Time Protocol)网络时间协议基于UDP,用于网络时间同步的协议,使网络中的计算机时钟同步到UTC,再配合各个时区的偏移调整就能实现精准同步对时功能。

在理解转换之前先讲一个NTP时间戳和UTC时间的定义(注意两种时间戳的起始时间不同,相差70年):

①NTP时间戳用一个64bit无符号定点数表示,它表示自从1900年1月1日00:00:00到现在过了多少秒。64bit分为两部分,高32bit(MSW)表示整数部分,单位是秒;低32bit(LSW)表示小数部分,单位是232皮秒。

②UTC时间,格林威治时间1970年1月1日00:00:00(北京时间1970年1月1日08:00:00)起至现在的总秒数,表示为1970-01-01 00:00:00 UTC。程序里习惯叫做UTC时间戳。

NTP协议中有四个时间戳,本文不讨论这四个时间戳的区别,只简单的拿其中一个NTP时间戳报文分析如何转换成UTC时间。例如一段时间戳报文为“D9 FD 84 95 94 F8 59 7C”,下面我们一起学习该NTP时间戳是如何转换成UTC时间的。

先处理MSW高位32bit“D9 FD 84 95”,将其转换为10进制3657270421,由于NTP时间和UTC时间起始不同,需要将该时间减少70年(1900年到1970年)2208988800(0x83AA7E80),则为1448281621,使用UTC转换器为2015-11-23 12:27:01 UTC(格林威治时间),2015-11-23 20:27:01 UTC+8(北京时间 UTC+8)

然后再处理LSW低位32bit“94 F8 59 7C”,在处理LSW之前先要了解1LSW=232ps是怎么来的,1 second =1,000,000,000,000 picoseconds,这个值很大,而2^32=4294967296,很明显用32bit无法精确到1 picoseconds,那就尽力而为,于是自然就把1,000,000,000,000 picoseconds劈成2^32份:

1,000,000,000,000/(2^32) = 232.83064365386962890625    即1LSW=232ps

故先将LSW乘以232转为ps,然后ps除以10^6就得到us了,于是有:usec=lsw*232/1000000

再看看秒的一些时间单位转换:

毫秒ms是10^-3秒;微妙us是10^-6秒;纳秒ns是10^-9秒;皮秒ps是10^-12秒

于是低位32bit“94 F8 59 7C”,将其转换为10进制2499303804,则:

usec=lsw*232/1000000=579838us=0.579838s

综上所述,故NTP时间戳“D9 FD 84 95 94 F8 59 7C”转换成UTC时间为2015-11-23 20:27:01.579838 UTC+8(北京时间)

写在最后的话:整理不易,若对你有帮助望支持点赞一下,谢谢。

NTP时间戳转换成UTC时间的过程相关推荐

  1. linux时间戳 gps,gps时间(gps时间戳转换成utc时间)

    GPS时间系统 GPS系统是测时测距系统,GPS定位要求有高度精确的.稳定的和连续的观测时间,因此时间系统对GPS定位具有重要意义.时间系统与坐标系统一样,应. 通俗的讲,所以存在的时间系统全部由两部 ...

  2. 将本地时间转换成 UTC 时间,0时区时间

    // 将时间戳转换成日期格式: function timestampToTime(timestamp) { var date = new Date(timestamp);//时间戳为10位需*1000 ...

  3. 当前时间转换成UTC时间

    以下为postman在Pre-request设置当前时间为UTC时间: //格式化时间方法-勿动 Date.prototype.format = function(format){ var o = { ...

  4. js将时间戳转换成正常时间格式两种方法

    //将时间戳转换成正常时间格式2     function timestampToTime(timestamp) {         var date = new Date(timestamp * 1 ...

  5. js将时间戳转换成正常时间

    //将时间戳转换成正常时间格式function timestampToTime(timestamp) {var date = new Date(timestamp * 1000);//时间戳为10位需 ...

  6. jQuery 将本地时间转换成 UTC 时间,计算时差,将UTC时间转换成 本地 时间

    //使用方式 let date = 'YYYY-MM-DD'; //你的时间格式(你的时间)//调用 FormatUtcDate(new Date( date + ' 00:00:00 ')) For ...

  7. DEDECMS自定义表单unix时间戳转换成常规时间方法及增加表单添加时间方法

    DEDECMS自定义表单提交的时间给转换成unix时间戳(一段数字),我们管理员在后台需要看到是日期,而不是那一行数字,下面方法可以解决这个问题,dedecms 5.6和5.7都可以,打开dede/t ...

  8. php把时间戳转换成多少时间之前函数

    函数实例 function wordTime($time) {$time = (int) substr($time, 0, 10);$int = time() - $time;$str = '';if ...

  9. js将时间戳转换成格林尼治时间

    // 2019-03-26 05:00:00 function formatDateT(dataTime) { var timestamp = dataTime;var newDate = new D ...

最新文章

  1. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 解决方法 java.lang.ClassNotFoundException: com.
  2. ActiveMQ_Linux安装(一)
  3. 最详细的JavaWeb开发基础之java环境搭建(Windows版)
  4. FPGA之道(24)VHDL数据类型
  5. Reinhold就Jigsaw投票一事向JCP提交公开信
  6. 阿里云云市场全新升级 瞄准需求拓生态
  7. SQL Server 2008 R2 系统配置检查器的检查参数和妨碍性问题的解决办法
  8. linux下开发python爬虫_linux入门教程—开发常用命令
  9. datetime-时间日期模块
  10. 信息学奥赛一本通(1398:短信计费)
  11. 单片机的内存分配(变量的存储位置)详解
  12. mv强制覆盖 shell_生产力工具:shell 与 Bash 脚本
  13. Java:多线程模拟多站点售票过程
  14. 数据结构 8-0 排序
  15. PMP考试一定要大量做题吗?
  16. uniapp web设置ios safri浏览器 添加到屏幕 像是应用 但是不用证书
  17. 基于Springboot+MybatisPlus+Layui的商品库存权限管理系统
  18. 免费在线汉字简体繁体转换工具
  19. 跳跃/经典动归/棋盘不同走向的表示模板
  20. Android第五次课→文件操作

热门文章

  1. 发送短信验证码时间控制,手机号校验,证件号校验
  2. 修改VMWARE的网卡类型、网卡ROM
  3. Braintree PayPal 支付网关开发(一)
  4. QCC---MDE使用介绍
  5. ISO 8601持续时间格式
  6. python电影爬虫系统毕设_从零开始搭建完整的电影全栈系统(一)——数据库设计及爬虫编写...
  7. [Java]数据类型
  8. 【acwing】1018. 最低通行费*
  9. dvbbs论坛的安装
  10. Matlab的freqz()函数和窗函数法fir1()一起使用