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 07 Python
python正常时间和unix时间戳相互转换的方法
Apr 23 Python
python 读取excel文件生成sql文件实例详解
May 12 Python
python学习之matplotlib绘制散点图实例
Dec 09 Python
Python中文编码知识点
Feb 18 Python
Python 通过打码平台实现验证码的实现
May 13 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
Jun 17 Python
Python 列表的清空方式
Jan 13 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
Feb 25 Python
Python selenium爬取微博数据代码实例
May 22 Python
Python Selenium模块安装使用教程详解
Jul 09 Python
Python中with上下文管理协议的作用及用法
Mar 18 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简单系统查询模块代码打包下载
2008/06/07 PHP
PHP面向对象分析设计的经验原则
2008/09/20 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
php两点地理坐标距离的计算方法
2018/12/29 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
2009/05/21 Javascript
通过Mootools 1.2来操纵HTML DOM元素
2009/09/15 Javascript
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
javascript,jquery闭包概念分析
2010/06/19 Javascript
this和执行上下文实现代码
2010/07/01 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
web 屏蔽BackSpace键实例代码
2016/12/24 Javascript
JavaScript数组去重的6个方法
2017/01/21 Javascript
JS动态生成年份和月份实例代码
2017/02/04 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
jQuery pjax 应用简单示例
2018/09/20 jQuery
了解javascript中变量及函数的提升
2019/05/27 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
python实现rest请求api示例
2014/04/22 Python
python实现比较文件内容异同
2018/06/22 Python
Python I/O与进程的详细讲解
2019/03/08 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
django框架forms组件用法实例详解
2019/12/10 Python
如何通过命令行进入python
2020/07/06 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
python实现简单猜单词游戏
2020/12/24 Python
英语专业推荐信
2013/11/16 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
优秀学生党员先进事迹材料
2014/05/29 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
检讨书大全
2015/01/27 职场文书
如何让你的Nginx支持分布式追踪详解
2022/07/07 Servers
Java Spring读取和存储详细操作
2022/08/05 Java/Android