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天气预报采集器实现代码(网页爬虫)
Oct 07 Python
python操作摄像头截图实现远程监控的例子
Mar 25 Python
Django的HttpRequest和HttpResponse对象详解
Jan 26 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
Oct 16 Python
Python获取航线信息并且制作成图的讲解
Jan 03 Python
OpenCV 模板匹配
Jul 10 Python
如何安装2019Pycharm最新版本(详细教程)
Sep 26 Python
Mac 使用python3的matplot画图不显示的解决
Nov 23 Python
matplotlib实现显示伪彩色图像及色度条
Dec 07 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
Django表单提交后实现获取相同name的不同value值
May 14 Python
MATLAB 如何求取离散点的曲率最大值
Apr 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下防止单引号,双引号在接受页面转义的设置方法
2008/09/25 PHP
PHP代码审核的详细介绍
2013/06/13 PHP
laravel 实现向公共模板中传值 (view composer)
2019/10/22 PHP
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
JavaScript起点(严格模式深度了解)
2013/01/28 Javascript
JS动态调用方法名示例介绍
2013/12/18 Javascript
JS 终止执行的实现方法
2016/11/24 Javascript
JavaScript函数参数的传递方式详解
2017/03/06 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
layui 阻止图片上传的实例(before方法)
2019/09/26 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
Vue——前端生成二维码的示例
2020/12/19 Vue.js
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
使用Python的Flask框架来搭建第一个Web应用程序
2016/06/04 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
利用python实现数据分析
2017/01/11 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
2017/08/31 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
Pandas删除数据的几种情况(小结)
2019/06/21 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
python 实现让字典的value 成为列表
2019/12/16 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
新锐科技Java程序员面试题
2016/07/25 面试题
AssertionError 跟一下那个类是 “is – a”的关系
2012/02/21 面试题
J2EE模式面试题
2016/10/11 面试题
简单的项目建议书模板
2014/03/12 职场文书
父母寄语大全
2014/04/12 职场文书
小学生综合素质评语
2014/04/23 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
党员承诺书范文2015
2015/04/27 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
详解Java实践之建造者模式
2021/06/18 Java/Android