因爲某種緣由(BIOS電池沒電),電腦的系統時間會與咱們的北京時間不一樣步,將會致使以下問題:python
1. 搶火車票的時候已通過時間了api
2.別的同事都走了,你還覺得沒下班服務器
……網絡
規避問題的方法:同步系統時間函數
在這裏,咱們有兩種方法工具
獲取Date 參數值,修改系統時間網站
def getTime(self,url): conn = http.client.HTTPConnection(url) conn.request("GET", "/") r = conn.getresponse() # r.getheaders() #獲取全部的http頭 ts = r.getheader('date') # 獲取http頭date部分 # 將GMT時間轉換成北京時間 ltime = time.strptime(ts[5:25], "%d %b %Y %H:%M:%S") # 格式ts ttime = time.localtime(time.mktime(ltime) + 8 * 60 * 60) # +東八區 dat = "date %u-%02u-%02u" % (ttime.tm_year, ttime.tm_mon, ttime.tm_mday) tm = "time %02u:%02u:%02u" % (ttime.tm_hour, ttime.tm_min, ttime.tm_sec) return [dat, tm]
在這裏解釋下strptime函數中,時間字符串的格式化說明url
%y 兩位數的年份表示(00-99) %a 本地簡化星期名稱 |
代碼中的%參數解析
%[flags][width][.precision][size]type
%02u : |
授時中心的網址:
http://www.pool.ntp.org/
ntplib 下載地址:
https://pypi.python.org/pypi/ntplib/
def getTime(self): c = ntplib.NTPClient() response = c.request('pool.ntp.org') # 授時中心的網址 ts_stamp = response.tx_time ts = time.localtime(ts_stamp) ttime = time.localtime(time.mktime(ts) + 8 * 60 * 60) # +東八區 return ts
獲取時間後,咱們要同步時間,同步時間也有兩種方法
def setTime(self,time): os.system(time[0]) os.system(time[1])
def setTime(self,time_cls): ttime = time.localtime(time.mktime(time_cls) - 8 * 60 * 60) # 本爲東八區,卻set後多出8小時 UTC多了8個小時 , 因此…… time_cls = ttime win32api.SetSystemTime(time_cls.tm_year, time_cls.tm_mon, time_cls.tm_wday, time_cls.tm_mday, time_cls.tm_hour, time_cls.tm_min, time_cls.tm_sec, 0)
完整代碼以下:
# -*- coding:utf-8 -*- # 1.獲取網絡時間 # 2.修改系統時間 import http.client import time import os,sys import ntplib import win32api ''' '同步時間類 ''' class syctimes(): def __init__(self): if sys.argv.__len__() == 1: try: time_list = self.getTime1() self.setTime1(time_list) except: time_list = self.getTime2('www.baidu.com') self.setTime2(time_list) for arg in sys.argv: if arg == '-1': time_list = self.getTime1() self.setTime1(time_list) if arg == '-2': time_list = self.getTime2('www.baidu.com') self.setTime2(time_list) sys.exit() def getTime1(self): c = ntplib.NTPClient() response = c.request('pool.ntp.org') # 授時中心的網址 ts_stamp = response.tx_time ts = time.localtime(ts_stamp) ttime = time.localtime(time.mktime(ts) + 8 * 60 * 60) # +東八區 return ts def getTime2(self,url): conn = http.client.HTTPConnection(url) conn.request("GET", "/") r = conn.getresponse() # r.getheaders() #獲取全部的http頭 ts = r.getheader('date') # 獲取http頭date部分 # 將GMT時間轉換成北京時間 ltime = time.strptime(ts[5:25], "%d %b %Y %H:%M:%S") # 格式ts ttime = time.localtime(time.mktime(ltime) + 8 * 60 * 60) # +東八區 dat = "date %u-%02u-%02u" % (ttime.tm_year, ttime.tm_mon, ttime.tm_mday) tm = "time %02u:%02u:%02u" % (ttime.tm_hour, ttime.tm_min, ttime.tm_sec) return [dat, tm] ''' 修改時間1 ''' def setTime1(self,time_cls): ttime = time.localtime(time.mktime(time_cls) - 8 * 60 * 60) # 本爲東八區,卻set後多出8小時 UTC多了8個小時 , 因此…… time_cls = ttime win32api.SetSystemTime(time_cls.tm_year, time_cls.tm_mon, time_cls.tm_wday, time_cls.tm_mday, time_cls.tm_hour, time_cls.tm_min, time_cls.tm_sec, 0) ''' 修改時間2 ''' def setTime2(self,time): os.system(time[0]) os.system(time[1]) if __name__ == "__main__": classSyc = syctimes() # 方法1: #time_list = classSyc.getTime1() #classSyc.setTime1(time_list) # 方法2: # time_list = classSyc.getTime2('www.baidu.com') # classSyc.setTime2(time_list)
打包代碼爲exe 添加隨系統啓動執行
import sys if __name__ == '__main__': from PyInstaller import __main__ params = ['-F', '-w', '--icon=favicon.ico', 'times.py'] __main__.run(params)
# -*- coding:utf-8 -*- import win32api import win32con name = 'SycTimeTool' # 要添加的項值名稱 path = 'E:\dcb3688\時間同步工具.exe -1' # 要添加的exe路徑 # 註冊表項名 KeyName = 'Software\\Microsoft\\Windows\\CurrentVersion\\Run' # 異常處理 try: key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, KeyName, 0, win32con.KEY_ALL_ACCESS) win32api.RegSetValueEx(key, name, 0, win32con.REG_SZ, path) win32api.RegCloseKey(key) except: print('error') print('添加成功!')