first commit
This commit is contained in:
commit
b786ea85d3
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
output/
|
BIN
icon.ico
Normal file
BIN
icon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
BIN
icon.png
Normal file
BIN
icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.8 KiB |
268
main.py
Normal file
268
main.py
Normal file
@ -0,0 +1,268 @@
|
||||
import json
|
||||
import os
|
||||
import ntplib
|
||||
import time
|
||||
import logging
|
||||
from datetime import datetime
|
||||
import win32api
|
||||
|
||||
# 配置日志
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
# ASCII 图像和软件信息
|
||||
ascii_art = r"""
|
||||
_ ____________
|
||||
/ | / /_ __/ __ \ _______ ______ ________ _____
|
||||
/ |/ / / / / /_/ / / ___/ / / / __ \/ ___/ _ \/ ___/
|
||||
/ /| / / / / ____/ (__ ) /_/ / / / / /__/ __/ /
|
||||
/_/ |_/ /_/ /_/ /____/\__, /_/ /_/\___/\___/_/
|
||||
/____/
|
||||
"""
|
||||
|
||||
software_info = """
|
||||
NTP syncer v1.0
|
||||
Version Date: 2024-06-16
|
||||
Copyright © 2024 earthjasonlin
|
||||
Homepage: https://git.loliquq.cn/earthjasonlin/NTP-syncer
|
||||
Description: This tool synchronizes your system time with multiple NTP servers, considering network delay and time correction.
|
||||
|
||||
========================================
|
||||
"""
|
||||
|
||||
# 打印 ASCII 图像和软件信息
|
||||
print(ascii_art)
|
||||
print(software_info)
|
||||
|
||||
# 定义 NTP 服务器池
|
||||
# ntp_servers = [
|
||||
# # 国家授时中心 NTP 服务器
|
||||
# "ntp.ntsc.ac.cn", "114.118.7.161", "114.118.7.163",
|
||||
# # 中国 NTP 快速授时服务
|
||||
# "cn.ntp.org.cn", "223.113.97.98", "114.67.103.73", "119.29.26.206", "120.25.115.20",
|
||||
# # 教育网
|
||||
# "edu.ntp.org.cn", "202.118.1.130", "202.118.1.81", "116.13.10.10",
|
||||
# # 中国计量科学研究院 NIM 授时服务
|
||||
# "ntp1.nim.ac.cn", "ntp2.nim.ac.cn", "111.203.6.13",
|
||||
# # 国际 NTP 快速授时服务
|
||||
# "cn.pool.ntp.org", "120.25.115.20", "111.230.189.174", "119.28.183.184",
|
||||
# # 阿里云公共 NTP 服务器
|
||||
# "ntp.aliyun.com", "ntp1.aliyun.com", "ntp2.aliyun.com", "ntp3.aliyun.com",
|
||||
# "ntp4.aliyun.com", "ntp5.aliyun.com", "ntp6.aliyun.com", "ntp7.aliyun.com",
|
||||
# "203.107.6.88", "182.92.12.11", "120.25.108.11",
|
||||
# # 腾讯云公共 NTP 服务器
|
||||
# "ntp.tencent.com", "ntp1.tencent.com", "ntp2.tencent.com", "ntp3.tencent.com",
|
||||
# "ntp4.tencent.com", "ntp5.tencent.com",
|
||||
# # 高通中国提供 NTP 服务
|
||||
# "time.izatcloud.net", "time.gpsonextra.net",
|
||||
# # 教育网(高校自建)
|
||||
# "ntp.sjtu.edu.cn", "ntp.neu.edu.cn", "ntp.bupt.edu.cn", "ntp.shu.edu.cn",
|
||||
# # 国际 NTP 快速授时服务
|
||||
# "pool.ntp.org", "0.pool.ntp.org", "1.pool.ntp.org", "2.pool.ntp.org", "3.pool.ntp.org",
|
||||
# "asia.pool.ntp.org", "64.62.194.188", "81.169.199.94",
|
||||
# # 谷歌公共 NTP 服务器
|
||||
# "time1.google.com", "time2.google.com", "time3.google.com", "time4.google.com",
|
||||
# "216.239.35.0", "216.239.35.4", "216.239.35.8", "216.239.35.12",
|
||||
# # 苹果公司公共 NTP 服务器
|
||||
# "time.apple.com", "time1.apple.com", "time2.apple.com", "time3.apple.com",
|
||||
# "time4.apple.com", "time5.apple.com", "time6.apple.com", "time7.apple.com",
|
||||
# "17.253.84.123", "17.253.84.125", "17.253.114.253", "17.253.116.253",
|
||||
# # Cloudflare NTP 服务器
|
||||
# "time.cloudflare.com", "162.159.200.1", "162.159.200.123",
|
||||
# # 微软 Windows NTP 服务器
|
||||
# "time.windows.com", "20.189.79.72", "52.148.114.188", "40.119.6.228", "51.137.137.111",
|
||||
# # 美国标准技术研究院 NTP 服务器
|
||||
# "time.nist.gov", "time-nw.nist.gov", "time-a.nist.gov", "time-b.nist.gov",
|
||||
# "128.138.141.172", "132.163.96.1", "132.163.96.2", "132.163.97.1", "132.163.97.2",
|
||||
# ]
|
||||
|
||||
# 默认配置
|
||||
default_config = {
|
||||
"ntp_servers": [
|
||||
"ntp.ntsc.ac.cn",
|
||||
"114.118.7.161",
|
||||
"114.118.7.163",
|
||||
"cn.ntp.org.cn",
|
||||
"223.113.97.98",
|
||||
"114.67.103.73",
|
||||
"119.29.26.206",
|
||||
"120.25.115.20",
|
||||
"edu.ntp.org.cn",
|
||||
"202.118.1.130",
|
||||
"202.118.1.81",
|
||||
"116.13.10.10",
|
||||
"ntp1.nim.ac.cn",
|
||||
"ntp2.nim.ac.cn",
|
||||
"111.203.6.13",
|
||||
"cn.pool.ntp.org",
|
||||
"120.25.115.20",
|
||||
"111.230.189.174",
|
||||
"119.28.183.184",
|
||||
"ntp.aliyun.com",
|
||||
"ntp1.aliyun.com",
|
||||
"ntp2.aliyun.com",
|
||||
"ntp3.aliyun.com",
|
||||
"ntp4.aliyun.com",
|
||||
"ntp5.aliyun.com",
|
||||
"ntp6.aliyun.com",
|
||||
"ntp7.aliyun.com",
|
||||
"203.107.6.88",
|
||||
"182.92.12.11",
|
||||
"120.25.108.11",
|
||||
"ntp.tencent.com",
|
||||
"ntp1.tencent.com",
|
||||
"ntp2.tencent.com",
|
||||
"ntp3.tencent.com",
|
||||
"ntp4.tencent.com",
|
||||
"ntp5.tencent.com",
|
||||
"time.izatcloud.net",
|
||||
"time.gpsonextra.net",
|
||||
"ntp.sjtu.edu.cn",
|
||||
"ntp.neu.edu.cn",
|
||||
"ntp.bupt.edu.cn",
|
||||
"ntp.shu.edu.cn",
|
||||
"pool.ntp.org",
|
||||
"0.pool.ntp.org",
|
||||
"1.pool.ntp.org",
|
||||
"2.pool.ntp.org",
|
||||
"3.pool.ntp.org",
|
||||
"asia.pool.ntp.org",
|
||||
"64.62.194.188",
|
||||
"81.169.199.94",
|
||||
"time1.google.com",
|
||||
"time2.google.com",
|
||||
"time3.google.com",
|
||||
"time4.google.com",
|
||||
"216.239.35.0",
|
||||
"216.239.35.4",
|
||||
"216.239.35.8",
|
||||
"216.239.35.12",
|
||||
"time.apple.com",
|
||||
"time1.apple.com",
|
||||
"time2.apple.com",
|
||||
"time3.apple.com",
|
||||
"time4.apple.com",
|
||||
"time5.apple.com",
|
||||
"time6.apple.com",
|
||||
"time7.apple.com",
|
||||
"17.253.84.123",
|
||||
"17.253.84.125",
|
||||
"17.253.114.253",
|
||||
"17.253.116.253",
|
||||
"time.cloudflare.com",
|
||||
"162.159.200.1",
|
||||
"162.159.200.123",
|
||||
"time.windows.com",
|
||||
"20.189.79.72",
|
||||
"52.148.114.188",
|
||||
"40.119.6.228",
|
||||
"51.137.137.111",
|
||||
"time.nist.gov",
|
||||
"time-nw.nist.gov",
|
||||
"time-a.nist.gov",
|
||||
"time-b.nist.gov",
|
||||
"128.138.141.172",
|
||||
"132.163.96.1",
|
||||
"132.163.96.2",
|
||||
"132.163.97.1",
|
||||
"132.163.97.2",
|
||||
],
|
||||
"update_interval": 600
|
||||
}
|
||||
|
||||
# 从 JSON 文件中读取 NTP 服务器列表和更新间隔
|
||||
def load_config(file_path):
|
||||
if not os.path.exists(file_path):
|
||||
with open(file_path, 'w', encoding='utf-8') as file:
|
||||
json.dump(default_config, file, ensure_ascii=False, indent=4)
|
||||
logging.info(f"The configuration file {file_path} does not exist. A default configuration file has been created.")
|
||||
logging.info("=" * 40) # 分隔符
|
||||
with open(file_path, 'r', encoding='utf-8') as file:
|
||||
config = json.load(file)
|
||||
return config['ntp_servers'], config['update_interval']
|
||||
|
||||
# 定义初始配置文件路径
|
||||
config_file_path = 'ntp_config.json'
|
||||
|
||||
# 加载 NTP 服务器列表和更新间隔
|
||||
ntp_servers, update_interval = load_config(config_file_path)
|
||||
last_successful_index = 0
|
||||
|
||||
def get_ntp_time(server):
|
||||
client = ntplib.NTPClient()
|
||||
|
||||
try:
|
||||
send_time = time.time()
|
||||
response = client.request(server, version=3)
|
||||
receive_time = time.time()
|
||||
|
||||
# 计算延迟
|
||||
delay = (receive_time - send_time) / 2
|
||||
|
||||
# 计算调整后的时间
|
||||
ntp_time = response.tx_time + delay
|
||||
return ntp_time, delay, response.tx_time
|
||||
except ntplib.NTPException as e:
|
||||
logging.warning(f"Unable to get NTP time from {server}: {e}")
|
||||
return None, None, None
|
||||
|
||||
def update_system_time(ntp_time):
|
||||
try:
|
||||
# 获取当前系统时间(更新前)
|
||||
current_system_time = datetime.utcnow()
|
||||
|
||||
# 格式化 NTP 时间为 datetime 对象(使用 UTC 时间)
|
||||
dt = datetime.utcfromtimestamp(ntp_time)
|
||||
|
||||
# 获取星期几 (0 是星期一, 6 是星期日)
|
||||
day_of_week = dt.weekday() + 1 # Windows API 需要 1 (星期一) 到 7 (星期日)
|
||||
|
||||
# 调用 win32api 设置系统时间
|
||||
win32api.SetSystemTime(
|
||||
dt.year, # 年
|
||||
dt.month, # 月
|
||||
day_of_week, # 星期几
|
||||
dt.day, # 日
|
||||
dt.hour, # 时
|
||||
dt.minute, # 分
|
||||
dt.second, # 秒
|
||||
int(dt.microsecond / 1000) # 毫秒
|
||||
)
|
||||
|
||||
# 获取当前系统时间(更新后)
|
||||
new_system_time = datetime.utcnow()
|
||||
|
||||
# 计算时间偏移(更新后的系统时间与NTP时间的差异)
|
||||
correction = (new_system_time - current_system_time).total_seconds()
|
||||
|
||||
logging.info(f"System time updated to: {dt.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]} UTC")
|
||||
logging.info(f"Time correction: {correction*1000:.3f} ms")
|
||||
except Exception as e:
|
||||
logging.error(f"Unable to update system time: {e}")
|
||||
|
||||
def main():
|
||||
global last_successful_index
|
||||
|
||||
while True:
|
||||
for i in range(len(ntp_servers)):
|
||||
index = (last_successful_index + i) % len(ntp_servers)
|
||||
server = ntp_servers[index]
|
||||
|
||||
ntp_time, delay, raw_ntp_time = get_ntp_time(server)
|
||||
|
||||
if ntp_time:
|
||||
last_successful_index = index
|
||||
logging.info(f"Got NTP time from {server}: {datetime.utcfromtimestamp(raw_ntp_time).strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]} UTC")
|
||||
logging.info(f"Network delay: {delay*1000:.3f} ms")
|
||||
|
||||
update_system_time(ntp_time)
|
||||
break
|
||||
else:
|
||||
logging.warning("All NTP servers attempted but unable to get time. Waiting for next attempt...")
|
||||
|
||||
# 每隔一段时间检查一次
|
||||
time.sleep(update_interval)
|
||||
|
||||
logging.info("=" * 40) # 分隔符
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
92
ntp_config.json
Normal file
92
ntp_config.json
Normal file
@ -0,0 +1,92 @@
|
||||
{
|
||||
"ntp_servers": [
|
||||
"ntp.ntsc.ac.cn",
|
||||
"114.118.7.161",
|
||||
"114.118.7.163",
|
||||
"cn.ntp.org.cn",
|
||||
"223.113.97.98",
|
||||
"114.67.103.73",
|
||||
"119.29.26.206",
|
||||
"120.25.115.20",
|
||||
"edu.ntp.org.cn",
|
||||
"202.118.1.130",
|
||||
"202.118.1.81",
|
||||
"116.13.10.10",
|
||||
"ntp1.nim.ac.cn",
|
||||
"ntp2.nim.ac.cn",
|
||||
"111.203.6.13",
|
||||
"cn.pool.ntp.org",
|
||||
"120.25.115.20",
|
||||
"111.230.189.174",
|
||||
"119.28.183.184",
|
||||
"ntp.aliyun.com",
|
||||
"ntp1.aliyun.com",
|
||||
"ntp2.aliyun.com",
|
||||
"ntp3.aliyun.com",
|
||||
"ntp4.aliyun.com",
|
||||
"ntp5.aliyun.com",
|
||||
"ntp6.aliyun.com",
|
||||
"ntp7.aliyun.com",
|
||||
"203.107.6.88",
|
||||
"182.92.12.11",
|
||||
"120.25.108.11",
|
||||
"ntp.tencent.com",
|
||||
"ntp1.tencent.com",
|
||||
"ntp2.tencent.com",
|
||||
"ntp3.tencent.com",
|
||||
"ntp4.tencent.com",
|
||||
"ntp5.tencent.com",
|
||||
"time.izatcloud.net",
|
||||
"time.gpsonextra.net",
|
||||
"ntp.sjtu.edu.cn",
|
||||
"ntp.neu.edu.cn",
|
||||
"ntp.bupt.edu.cn",
|
||||
"ntp.shu.edu.cn",
|
||||
"pool.ntp.org",
|
||||
"0.pool.ntp.org",
|
||||
"1.pool.ntp.org",
|
||||
"2.pool.ntp.org",
|
||||
"3.pool.ntp.org",
|
||||
"asia.pool.ntp.org",
|
||||
"64.62.194.188",
|
||||
"81.169.199.94",
|
||||
"time1.google.com",
|
||||
"time2.google.com",
|
||||
"time3.google.com",
|
||||
"time4.google.com",
|
||||
"216.239.35.0",
|
||||
"216.239.35.4",
|
||||
"216.239.35.8",
|
||||
"216.239.35.12",
|
||||
"time.apple.com",
|
||||
"time1.apple.com",
|
||||
"time2.apple.com",
|
||||
"time3.apple.com",
|
||||
"time4.apple.com",
|
||||
"time5.apple.com",
|
||||
"time6.apple.com",
|
||||
"time7.apple.com",
|
||||
"17.253.84.123",
|
||||
"17.253.84.125",
|
||||
"17.253.114.253",
|
||||
"17.253.116.253",
|
||||
"time.cloudflare.com",
|
||||
"162.159.200.1",
|
||||
"162.159.200.123",
|
||||
"time.windows.com",
|
||||
"20.189.79.72",
|
||||
"52.148.114.188",
|
||||
"40.119.6.228",
|
||||
"51.137.137.111",
|
||||
"time.nist.gov",
|
||||
"time-nw.nist.gov",
|
||||
"time-a.nist.gov",
|
||||
"time-b.nist.gov",
|
||||
"128.138.141.172",
|
||||
"132.163.96.1",
|
||||
"132.163.96.2",
|
||||
"132.163.97.1",
|
||||
"132.163.97.2"
|
||||
],
|
||||
"update_interval": 10
|
||||
}
|
2
requirements.txt
Normal file
2
requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
ntplib
|
||||
pywin32
|
Loading…
x
Reference in New Issue
Block a user