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实现快速多线程ping的方法
Jul 15 Python
举例讲解Python面向对象编程中类的继承
Jun 17 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
Aug 31 Python
详解使用 pyenv 管理多个版本 python 环境
Oct 19 Python
python操作oracle的完整教程分享
Jan 30 Python
浅谈Series和DataFrame中的sort_index方法
Jun 07 Python
Pycharm无法显示动态图片的解决方法
Oct 28 Python
python3访问字典里的值实例方法
Nov 18 Python
Python获取指定网段正在使用的IP
Dec 14 Python
Python爬虫基础初探selenium
May 31 Python
opencv 分类白天与夜景视频的方法
Jun 05 Python
python实现股票历史数据可视化分析案例
Jun 10 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
全国FM电台频率大全 - 20 广西省
2020/03/11 无线电
php的正则处理函数总结分析
2008/06/20 PHP
smarty的section嵌套循环用法示例
2016/05/28 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
script的async属性以非阻塞的模式加载脚本
2013/01/15 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
jQuery中复合属性选择器用法实例
2014/12/31 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
jquery如何获取元素的滚动条高度等实现代码
2015/10/19 Javascript
JS遍历数组及打印数组实例分析
2016/01/21 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
JavaScript实现点击按钮字体放大、缩小
2016/02/29 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
js控制台输出的方法(详解)
2016/11/26 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
Vue学习笔记进阶篇之单元素过度
2017/07/19 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
python数据结构之二叉树的遍历实例
2014/04/29 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
django实现用户注册实例讲解
2019/10/30 Python
python实现飞行棋游戏
2020/02/05 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
应届大学生自荐信格式
2013/09/21 职场文书
机关单位动员会主持词
2014/03/20 职场文书
辞职书格式样本
2015/02/26 职场文书
英文辞职信范文
2015/05/13 职场文书
英语演讲开场白
2015/05/29 职场文书
Win11跳过联网界面创建本地管理账户的3种方法
2022/04/20 数码科技