Python检查和同步本地时间(北京时间)的实现方法


Posted in Python onDecember 03, 2018

背景

有时本地服务器的时间不准了,需要同步互联网上的时间。

解决方案

  1. NTP时间同步,找到一些可用的NTP服务器进行同步即可。
  2. 通过获取一些大型网站的时间来同步为自己的时间。

* 由于NTP时间同步,如果相差比如有好几个小时,那么时间不同步矫正回来其实是非常慢的;我本次主要就是讲第2种方案,通过Python来实现的,可以直接设置为互联网上的时间。

要点描述

  • 假设:百度、淘宝等非常大型的网站的时间是正确的
  • 访问百度、淘宝等网站,它返回的HTTP Header中包含一个时间戳(一般是GMT时间)。
  • 根据这个时间戳,可以解析为当前的北京时间
  • 可以检查本地服务器时间与互联网时间是否一致
  • 可以使用date -s命令设置本地系统时间
  • 还可以使用hwclock -w将系统时间同步回硬件中保存

代码实现

代码见:https://github.com/smilejay/python/blob/master/py2018/set_check_localtime.py

代码在CentOS 7.4系统上Python 2.7上正常运行

为了考虑到兼容性和运行的方便性,代码中发送HTTP请求没有使用最流行的requests库而是使用了urllib2这个Python标准库。

# -*- coding: utf-8
 
import sys
import time
import subprocess
import argparse
import urllib2
 
 
def set_beijing_time_from_web(url):
 ''' set os and hardware clock as beijing time from internet '''
 # use urllib2 in python2; not use requests which need installation
 response = urllib2.urlopen(url)
 #print response.read()
 # 获取http头date部分
 ts = response.headers['date']
 # 将日期时间字符转化为time
 gmt_time = time.strptime(ts[5:25], "%d %b %Y %H:%M:%S")
 # 将GMT时间转换成北京时间
 local_time = time.localtime(time.mktime(gmt_time) + 8*3600)
 str1 = "%u-%02u-%02u" % (local_time.tm_year,
        local_time.tm_mon, local_time.tm_mday)
 str2 = "%02u:%02u:%02u" % (
  local_time.tm_hour, local_time.tm_min, local_time.tm_sec)
 cmd = 'date -s "%s %s"' % (str1, str2)
 #print cmd
 subprocess.check_call(cmd, shell=True)
 hw_cmd = 'hwclock -w'
 #print hw_cmd
 subprocess.check_call(hw_cmd, shell=True)
 print 'OK. set time: %s' % ' '.join([str1, str2])
 
 
def check_localtime_with_internet(url):
 ''' check local time with internet '''
 threshold = 2
 # use urllib2 in python2; not use requests which need installation
 response = urllib2.urlopen(url)
 #print response.read()
 # 获取http头date部分
 ts = response.headers['date']
 # 将日期时间字符转化为time
 gmt_time = time.strptime(ts[5:25], "%d %b %Y %H:%M:%S")
 # 将GMT时间转换成北京时间
 internet_ts = time.mktime(gmt_time)
 local_ts = time.mktime(time.gmtime())
 if abs(local_ts - internet_ts) <= threshold:
  print 'OK. check localtime.'
 else:
  print 'ERROR! local_ts: %s internet_ts:%s' % (local_ts, internet_ts)
  sys.exit(1)
 
 
if __name__ == '__main__':
 url = 'http://www.baidu.com'
 parser = argparse.ArgumentParser()
 parser.description = 'set/check localtime (i.e. CST) with internet'
 parser.add_argument('-c', '--check', action='store_true',
      help='only check local time')
 parser.add_argument('-s', '--set', action='store_true',
      help='only set local time')
 parser.add_argument('-u', '--url', default=url,
      help='the url to sync time')
 args = parser.parse_args()
 if args.set:
  set_beijing_time_from_web(args.url)
 else:
  check_localtime_with_internet(args.url)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Django集成百度富文本编辑器uEditor攻略
Jul 04 Python
python创建和删除目录的方法
Apr 29 Python
Python实现手写一个类似django的web框架示例
Jul 20 Python
Python安装pycurl失败的解决方法
Oct 15 Python
详解django+django-celery+celery的整合实战
Mar 19 Python
Python中查看变量的类型内存地址所占字节的大小
Jun 26 Python
PHP统计代码行数的小代码
Sep 19 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
wxPython+Matplotlib绘制折线图表
Nov 19 Python
Python生态圈图像格式转换问题(推荐)
Dec 02 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 Python
解决c++调用python中文乱码问题
Jul 29 Python
python 实现语音聊天机器人的示例代码
Dec 02 #Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
Dec 02 #Python
在pycharm上mongodb配置及可视化设置方法
Nov 30 #Python
PyCharm配置mongo插件的方法
Nov 30 #Python
对python自动生成接口测试的示例讲解
Nov 30 #Python
在unittest中使用 logging 模块记录测试数据的方法
Nov 30 #Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
Nov 30 #Python
You might like
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
Jquery 获取表单text,areatext,radio,checkbox,select值的代码
2009/11/12 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
浅析IE10兼容性问题(frameset的cols属性)
2014/01/03 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
JavaScript中ES6字符串扩展方法
2016/08/26 Javascript
js实现简单的手风琴效果
2017/02/27 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
python通过socket查询whois的方法
2015/07/18 Python
python 实现在Excel末尾增加新行
2018/05/02 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
浅谈Python编程中3个常用的数据结构和算法
2019/04/30 Python
Django上使用数据可视化利器Bokeh解析
2019/07/31 Python
python实现图片压缩代码实例
2019/08/12 Python
pytorch 共享参数的示例
2019/08/17 Python
python 调试冷知识(小结)
2019/11/11 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
葡萄牙航空官方网站:TAP Air Portugal
2019/10/31 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
清华大学自主招生自荐信
2014/01/29 职场文书
医学专业职业生涯规划范文
2014/02/05 职场文书
共产党员承诺书
2014/03/25 职场文书
医药营销个人求职信
2014/04/12 职场文书
小城镇建设汇报材料
2014/08/16 职场文书
利用python调用摄像头的实例分析
2021/06/07 Python
Python实现抖音热搜定时爬取功能
2022/03/16 Python