python自动获取北京时间_Python检查和同步本地时间(北京时间)的实现方法

背景

有时本地服务器的时间不准了,需要同步互联网上的时间。

解决方案

NTP时间同步,找到一些可用的NTP服务器进行同步即可。

通过获取一些大型网站的时间来同步为自己的时间。

* 由于NTP时间同步,如果相差比如有好几个小时,那么时间不同步矫正回来其实是非常慢的;我本次主要就是讲第2种方案,通过Python来实现的,可以直接设置为互联网上的时间。

要点描述

假设:百度、淘宝等非常大型的网站的时间是正确的

访问百度、淘宝等网站,它返回的HTTP Header中包含一个时间戳(一般是GMT时间)。

根据这个时间戳,可以解析为当前的北京时间

可以检查本地服务器时间与互联网时间是否一致

可以使用date -s命令设置本地系统时间

还可以使用hwclock -w将系统时间同步回硬件中保存

代码实现

代码在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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值