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实现简单HTML表格解析的方法
Jun 15 Python
python生成ppt的方法
Jun 07 Python
用python生成1000个txt文件的方法
Oct 25 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
python的一些加密方法及python 加密模块
Jul 11 Python
Python控制台实现交互式环境执行
Jun 09 Python
Python实例方法、类方法、静态方法区别详解
Sep 05 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
Sep 18 Python
基于python模拟bfs和dfs代码实例
Nov 19 Python
PyQt5通过信号实现MVC的示例
Feb 06 Python
Python中for后接else的语法使用
May 18 Python
Python MNIST手写体识别详解与试练
Nov 07 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
JAVA/JSP学习系列之七
2006/10/09 PHP
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
php计算税后工资的方法
2015/07/28 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
怎么清空javascript数组
2013/05/11 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
JS是按值传递还是按引用传递
2015/01/30 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
Vue toFixed保留两位小数的3种方式
2020/10/23 Javascript
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
Python 微信爬虫完整实例【单线程与多线程】
2019/07/06 Python
python实现在函数图像上添加文字和标注的方法
2019/07/08 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
北美三大旅游网站之一:Travelocity
2017/08/12 全球购物
英国团购网站:Groupon英国
2017/11/28 全球购物
Nº21官方在线商店:numeroventuno.com
2019/09/26 全球购物
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
美食节目策划方案
2014/05/31 职场文书
在职证明书范本(2014新版)
2014/09/25 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
教师节倡议书2015
2015/04/27 职场文书
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python