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计数排序和基数排序算法实例
Apr 25 Python
Python语言的12个基础知识点小结
Jul 10 Python
python获取文件版本信息、公司名和产品名的方法
Oct 05 Python
Django中使用group_by的方法
May 26 Python
wxPython实现窗口用图片做背景
Apr 25 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
Sep 17 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
获取django框架orm query执行的sql语句实现方法分析
Jun 20 Python
python实现的读取网页并分词功能示例
Oct 29 Python
python爬取豆瓣电影排行榜(requests)的示例代码
Feb 18 Python
基于Python编写简易版的天天跑酷游戏的示例代码
Mar 23 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在页面中调用fckeditor编辑器的方法
2011/06/10 PHP
codeigniter使用技巧批量插入数据实例方法分享
2013/12/31 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
sina的lightbox效果。
2007/01/09 Javascript
浅谈javascript的数据类型检测
2010/07/10 Javascript
Javascript操作URL函数修改版
2013/11/07 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
window resize和scroll事件的基本优化思路
2014/04/29 Javascript
初识Javascript小结
2015/07/16 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
Vuejs第十篇之vuejs父子组件通信
2016/09/06 Javascript
jQuery基于排序功能实现上移、下移的方法
2016/11/26 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
利用PHP实现递归删除链表元素的方法示例
2020/10/23 Javascript
python解析xml文件实例分享
2013/12/04 Python
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
wxPython中listbox用法实例详解
2015/06/01 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
Python实现打砖块小游戏代码实例
2019/05/18 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
python实现扫雷游戏的示例
2020/10/20 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
JSP&Servlet技术面试题
2015/05/21 面试题
证券期货行业个人的自我评价
2013/12/26 职场文书
旅游网创业计划书
2014/01/31 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
化学系大学生自荐信范文
2014/03/01 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
2016年春节问候语
2015/11/11 职场文书