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实现的检测web服务器健康状况的小程序
Sep 17 Python
Python易忽视知识点小结
May 25 Python
使用Python编写简单的端口扫描器的实例分享
Dec 18 Python
python3大文件解压和基本操作
Dec 15 Python
机器学习经典算法-logistic回归代码详解
Dec 22 Python
python得到一个excel的全部sheet标签值方法
Dec 10 Python
python实现批量nii文件转换为png图像
Jul 18 Python
python3发送邮件需要经过代理服务器的示例代码
Jul 25 Python
Pytorch Tensor 输出为txt和mat格式方式
Jan 03 Python
给Python学习者的文件读写指南(含基础与进阶)
Jan 29 Python
matplotlib.pyplot.matshow 矩阵可视化实例
Jun 16 Python
python文件与路径操作神器 pathlib
Apr 01 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
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
php日期操作技巧小结
2016/06/25 PHP
document.createElement()用法及注意事项(ff下不兼容)
2013/03/13 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
2014/12/15 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
json数据处理及数据绑定
2017/01/25 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
[08:54]《一刀刀一天》之DOTA全时刻18:十九支奔赴西雅图队伍全部出炉
2014/06/04 DOTA
python刷投票的脚本实现代码
2014/11/08 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
浅谈Pandas:Series和DataFrame间的算术元素
2018/12/22 Python
Python中按值来获取指定的键
2019/03/04 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
canvas绘图按照contain或者cover方式适配并居中显示
2019/02/18 HTML / CSS
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
c/c++某大公司的两道笔试题
2014/02/02 面试题
linux面试题参考答案(7)
2012/10/29 面试题
优秀大学生推荐信范文
2013/11/28 职场文书
QQ空间主人寄语大全
2014/04/12 职场文书
某某同志考察材料
2014/05/28 职场文书
公司年终奖分配方案
2014/06/16 职场文书
雷锋观后感
2015/06/10 职场文书
课程设计感想范文
2015/08/11 职场文书
青少年法制教育心得体会
2016/01/14 职场文书
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS