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中下划线的使用方法
Mar 27 Python
python操作列表的函数使用代码详解
Dec 28 Python
python批量修改图片大小的方法
Jul 24 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
Mar 05 Python
python基于itchat模块实现微信防撤回
Apr 29 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
python-序列解包(对可迭代元素的快速取值方法)
Aug 24 Python
什么是python的id函数
Jun 11 Python
python怎么对数字进行过滤
Jul 05 Python
如何使用Django Admin管理后台导入CSV
Nov 06 Python
通过python-pptx模块操作ppt文件的方法
Dec 26 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&amp;java(三)
2006/10/09 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
php微信开发之关注事件
2018/06/14 PHP
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
关于图片按比例自适应缩放的js代码
2011/10/30 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
2014/03/12 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
JavaScript数据类型判定的总结笔记
2015/07/31 Javascript
整理Javascript基础入门学习笔记
2015/11/29 Javascript
jQuery.datatables.js插件用法及api实例详解
2016/10/28 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
2017/06/28 Javascript
Node.js中使用mongoose操作mongodb数据库的方法
2017/09/12 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
使用JavaScript通过前端发送电子邮件
2020/05/22 Javascript
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
python正则表达式修复网站文章字体不统一的解决方法
2013/02/21 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
将TensorFlow的模型网络导出为单个文件的方法
2018/04/23 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
python中return不返回值的问题解析
2020/07/22 Python
python 下载文件的几种方法汇总
2021/01/06 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
css3的transition属性详解
2014/12/15 HTML / CSS
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
《锄禾》教学反思
2014/04/08 职场文书
主题实践活动总结
2014/05/08 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
幼儿园大班开学寄语(2016秋季)
2015/12/03 职场文书
高一英语教学反思
2016/03/03 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python