[TOC]python
时间,对于咱们来讲很重要,何时作什么?何时发生什么?没有时间的概念,生活就乱了。算法
在平常的运维当中,咱们更关注告警的时间:何时发生、什么事故、影响范围、何时解决,都是有关联性的,因此时间的准确性是很是很是的重要。安全
你可能会好奇,时间究竟是怎么来的呢?做为网工的你,可能你也不是很清楚吧?服务器
原子钟和GPS是做为标准参考时钟,全世界都以它为时钟源。微信
从你手表或电脑的时间同步到时钟源,中间可能通过多层级,每一层叫作 'stratum' ,只是精确度不同而已。固然,咱们确定不是直接和原子钟同步,咱们能够选择最近的主时钟源,好比中国/香港等等。网络
或者,大家公司内网多是同步到内网的主时钟服务器,而后同步到互联网去。运维
说完了时钟源,那么得有一个时间标准吧,全世界每一个国家时区都不同,不能用一个时间给全地球用吧。分布式
GMT(Greenwich Mean Time): 格林尼治标准时间,以太阳横穿格林尼治子午线(本初子午线)来计算,现不推荐;编码
UTC( Universal Time Coordinated ):协调世界时间 , 以原子时秒长为基础 ,接近GMT,做为世界标准时间。spa
为了统一世界的时间,1884年的国际经度会议规规定将全球划分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为零时区(GMT+00),东1-12区,西1-12区,中国北京处于东8区(GMT+08)
举个栗子:
UTC 时间:2019-11-10 16:00:00
北京时间:2019-11-11 00:00:00 (UTC + 8个小时)复制代码
时钟源和标准时间说完了,那么接下来说下时间同步通讯机制。
版本 | 时间 | 协议号 | 描述 |
---|---|---|---|
NTPv1 | 1988年6月 | RFC 1059 | 首次提出了完整的NTP规则以及算法,可是NTPv1不支持认证和控制消息 |
NTPv2 | 1989年9月 | RFC 1119 | 支持认证和控制消息 |
NTPv3 | 1992年3月 | RFC 1305 | 正式引入了校订原则,并改进了时钟选择和时钟过滤算法。NTPv3目前应用较为普遍,仅支持IPv4 |
NTPv4 | 2010年6月 | RFC 5905 | 支持IPv4和IPv6,安全性更高。 |
准备好三方库:ntplib
安装方法:
pip3 install -i [https://pypi.douban.com/simple/](https://pypi.douban.com/simple/) ntplib复制代码
环境:Windows + Python3
#!/usr/bin/env python3
#-*- coding:UTF-8 -*-
#欢迎关注微信公众号:点滴技术
#这里有靠谱、有价值、免费分享
import ntplib
import os,datetime
hosts = ['0.cn.pool.ntp.org','1.cn.pool.ntp.org','2.cn.pool.ntp.org','3.cn.pool.ntp.org']
def ntp_client():
#建立实例,NTPClient()是一个类
t = ntplib.NTPClient()
for host in hosts:
try:
#ntp server能够填写主机和域名,建议用域名
#缺省端口为ntp, 版本为2, 超时为5s
#做用:查询 NTP 服务器,并返回对象
r = t.request(host , port='ntp', version=4, timeout=5)
if r:
break
except Exception as e:
pass
#显示的是时间戳
t = r.tx_time
#使用datetime模块,格式化:x年x月x日 时:分:秒.毫秒
_date,_time = str(datetime.datetime.fromtimestamp(t))[:22].split(' ')
print("调整前时间是:", datetime.datetime.now())
os.system('date {} && time {}'.format(_date, _time))
print("调整后时间是:", datetime.datetime.now())
if __name__ == '__main__':
#适用于Windows
ntp_client()复制代码
在windowns环境下,经过'管理员'运行'cmd',进入到对应的文件路径,运行结果以下所示:
备注:截至目前,还没有找到可以在pycharm直接运行代码,报错 “客户端没有所需的特权”,后续研究 'ctypes' 看可否实现。
关于pycharm运行'os.system()' 出现中文乱码问题,须要改下编码问题,设置以下:
若是喜欢个人文章,欢迎关注个人公众号:点滴技术,扫码关注,不按期分享