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实现定时播放mp3
Mar 29 Python
python获取本机mac地址和ip地址的方法
Apr 29 Python
Python3控制路由器——使用requests重启极路由.py
May 11 Python
深入解析Python中的__builtins__内建对象
Jun 21 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
python实现多层感知器MLP(基于双月数据集)
Jan 18 Python
python实现网站微信登录的示例代码
Sep 18 Python
彻底解决Python包下载慢问题
Nov 15 Python
Pandas中两个dataframe的交集和差集的示例代码
Dec 13 Python
python 下载文件的几种方法汇总
Jan 06 Python
详解Python模块化编程与装饰器
Jan 16 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基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
php下使用SMTP发邮件的代码
2008/01/10 PHP
php截取utf-8中文字符串乱码的解决方法
2010/03/29 PHP
php邮件发送,php发送邮件的类
2011/03/24 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
详解vue.js下引入百度地图jsApi的两种方法
2018/07/27 Javascript
对layui中表单元素的使用详解
2018/08/15 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
Jquery 动态添加元素并添加点击事件实现过程解析
2019/10/12 jQuery
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
Python扩展内置类型详解
2018/03/26 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
人工神经网络算法知识点总结
2019/06/11 Python
Python二维码生成识别实例详解
2019/07/16 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
详解CSS 3 中的 calc() 方法
2018/01/12 HTML / CSS
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
幼儿园毕业教师感言
2014/02/21 职场文书
2015中学政教处工作总结
2015/07/22 职场文书
2016国培研修心得体会
2016/01/08 职场文书
应用最多的公文《通知》如何写?
2019/04/02 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
解决xampp安装后Apache无法启动
2022/03/21 Servers
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫