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清除字符串里非字母字符的方法
Jul 02 Python
浅谈python中的实例方法、类方法和静态方法
Feb 17 Python
python中defaultdict的用法详解
Jun 07 Python
Python实现端口检测的方法
Jul 24 Python
Python爬虫常用小技巧之设置代理IP
Sep 13 Python
浅谈python中拼接路径os.path.join斜杠的问题
Oct 23 Python
Python中的 enum 模块源码详析
Jan 09 Python
基于Python的ModbusTCP客户端实现详解
Jul 13 Python
基于Django框架的权限组件rbac实例讲解
Aug 31 Python
python二进制读写及特殊码同步实现详解
Oct 11 Python
python matplotlib折线图样式实现过程
Nov 04 Python
Python库安装速度过慢解决方案
Jul 14 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中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
定义php常量的详解
2013/06/09 PHP
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
8个PHP程序员常用的功能汇总
2014/12/18 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
JavaScript中的私有成员
2006/09/18 Javascript
js操作时间(年-月-日 时-分-秒 星期几)
2010/06/20 Javascript
初学js 新节点的创建 删除 的步骤
2011/07/04 Javascript
js 走马灯简单实例
2013/11/21 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
JS小游戏之象棋暗棋源码详解
2014/09/25 Javascript
jQuery+jRange实现滑动选取数值范围特效
2015/03/14 Javascript
jquery如何获取元素的滚动条高度等实现代码
2015/10/19 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
Laravel+Dingo/Api 自定义响应的实现
2019/02/17 Python
Python爬虫之urllib基础用法教程
2019/10/12 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
Python 图片处理库exifread详解
2021/02/25 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
优秀班组长事迹
2014/05/31 职场文书
运动会演讲稿100字
2014/08/25 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
销售会议开幕词
2015/01/28 职场文书
淘宝客服专员岗位职责
2015/04/07 职场文书
世界十大狙击步枪排行榜
2022/03/20 杂记
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫