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类的基础入门知识
Nov 24 Python
python base64 decode incorrect padding错误解决方法
Jan 08 Python
Python读取mp3中ID3信息的方法
Mar 05 Python
常用python编程模板汇总
Feb 12 Python
Python实现模拟登录网易邮箱的方法示例
Jul 05 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
Jul 12 Python
python实现两个dict合并与计算操作示例
Jul 01 Python
Django 再谈一谈json序列化
Mar 16 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
Apr 07 Python
Python生成pdf目录书签的实例方法
Oct 29 Python
Django中的DateTimeField和DateField实现
Feb 24 Python
解决numpy和torch数据类型转化的问题
May 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
关于IIS php调用com组件的权限问题
2012/01/11 PHP
php include和require的区别深入解析
2013/06/17 PHP
php去掉文件前几行的方法
2015/07/29 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
Javascript 遍历对象中的子对象
2009/07/03 Javascript
Javascript操作cookie的函数代码
2012/10/03 Javascript
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
基于jQuery实现音乐播放试听列表
2016/04/14 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
docker中编译nodejs并使用nginx启动
2017/06/23 NodeJs
在vue项目中,将juery设置为全局变量的方法
2018/09/25 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
python用户管理系统
2018/03/13 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
学生如何注册Pycharm专业版以及pycharm的安装
2020/09/24 Python
详解HTML5 Canvas绘制时指定颜色与透明度的方法
2016/03/25 HTML / CSS
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
毕业生学校推荐信范文
2014/05/21 职场文书
教师四风问题对照检查材料
2014/09/26 职场文书
毕业设计论文致谢词
2015/05/14 职场文书
2016高考寄语或鼓励的话语
2015/12/04 职场文书
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS