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原始套接字编程示例分享
Feb 21 Python
python采集博客中上传的QQ截图文件
Jul 18 Python
基于Python实现的百度贴吧网络爬虫实例
Apr 17 Python
python协程用法实例分析
Jun 04 Python
对Python中的@classmethod用法详解
Apr 21 Python
Python实现查找最小的k个数示例【两种解法】
Jan 08 Python
python实现浪漫的烟花秀
Jan 30 Python
Python分析彩票记录并预测中奖号码过程详解
Jul 09 Python
python 实现多维数组转向量
Nov 30 Python
Python获取对象属性的几种方式小结
Mar 12 Python
python爬虫实现获取下一页代码
Mar 13 Python
详解非极大值抑制算法之Python实现
Jun 28 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 无法载入mysql扩展
2010/03/12 PHP
Laravel实现表单提交
2017/05/07 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
js本身的局限性 别让javascript做太多事
2010/03/23 Javascript
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
2010/06/19 Javascript
基于jQuery的一个扩展form序列化到json对象
2010/12/09 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
2013/02/05 Javascript
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
Python 解析XML文件
2009/04/15 Python
Python文件操作,open读写文件,追加文本内容实例
2016/12/14 Python
利用Python实现Windows定时关机功能
2017/03/21 Python
Python实现的质因式分解算法示例
2018/05/03 Python
详解Python中的分支和循环结构
2020/02/11 Python
Python restful框架接口开发实现
2020/04/13 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
英国家电直销:Appliances Direct
2016/09/22 全球购物
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
师范类求职信
2014/06/21 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript
手把手教你从零开始react+antd搭建项目
2021/06/03 Javascript