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 相关文章推荐
Python自动化测试工具Splinter简介和使用实例
May 13 Python
Python守护进程用法实例分析
Jun 04 Python
Python实现批量转换文件编码的方法
Jul 28 Python
Windows平台Python连接sqlite3数据库的方法分析
Jul 12 Python
Python中修改字符串的四种方法
Nov 02 Python
python实现二级登陆菜单及安装过程
Jun 21 Python
python getpass实现密文实例详解
Sep 24 Python
Python中的引用和拷贝实例解析
Nov 14 Python
python用pip install时安装失败的一系列问题及解决方法
Feb 24 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
如何对python的字典进行排序
Jun 19 Python
Python中异常处理用法
Nov 27 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 mysql Errcode: 28 终极解决方法
2009/07/01 PHP
php隐藏IP地址后两位显示为星号的方法
2014/11/21 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
2016/10/26 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
js调用flash的效果代码
2008/04/26 Javascript
jquery下操作HTML控件的实现代码
2010/01/12 Javascript
JS实现self的resend
2010/07/22 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
2015/04/24 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
Bootstrap每天必学之面板
2015/11/30 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
ES6扩展运算符用法实例分析
2017/10/31 Javascript
vue组件实现可搜索下拉框扩展
2020/10/23 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
2019/04/22 Javascript
vue+express+jwt持久化登录的方法
2019/06/14 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
Python程序设计入门(5)类的使用简介
2014/06/16 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
2015/06/28 Python
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
python一行sql太长折成多行并且有多个参数的方法
2018/07/19 Python
DRF跨域后端解决之django-cors-headers的使用
2019/01/27 Python
Python datetime包函数简单介绍
2019/08/28 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
PyQt实现计数器的方法示例
2021/01/18 Python
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
工程总经理工作职责
2013/12/09 职场文书
《雪地里的小画家》教学反思
2014/02/22 职场文书
网站美工岗位职责
2014/04/02 职场文书
岗位明星事迹材料
2014/05/18 职场文书
财务人员个人工作总结
2015/02/27 职场文书