Python设置系统时间:两种NTP校时脚本实现方案

阿橙
阿橙
发布时间:2026-10-12| 3人浏览过
原创

本文介绍通过Python脚本快速校准Windows系统时间的两种方法。第一种基于原生socket与win32api直接读取NTP服务器数据并写入;第二种借助ntplib库解析时间戳,结合命令行命令完成同步。附带环境准备、完整代码示例及权限排查指南,无需复杂配置即可实现精准对时。

脚本运行环境准备

两种方法均面向Windows操作系统设计。由于修改系统全局时钟属于内核级操作,脚本必须在管理员权限下运行(如右键IDLE或终端选择“以管理员身份运行”),否则会触发拒绝访问错误。此外,确保本机网络连接正常,能够访问公共NTP服务节点。若使用第一种纯原生方案,需提前确认 pywin32 已安装;若使用第二种方案,需安装第三方解析库 ntplib。

方法一:原生 Socket 直连授时服务器

该方案不依赖任何外部解析包,通过底层UDP协议直接与时间服务器通信。其核心流程是构建NTP标准查询报文,接收服务端返回的12字整型数组,剥离1900年起始偏移量后换算为UTC时间,最后交由 win32api 完成写入。

import socket
import struct
import time
import win32api

# 推荐使用稳定域名替代单一静态IP,防DNS劫持或线路波动
TimeServer = 'pool.ntp.org'
Port = 123

def getTime():
    TIME_1970_OFFSET = 2208988800
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    data = '\x1b' + 47 * '\0'
    client.sendto(data, (TimeServer, Port))
    data, address = client.recvfrom(1024)
    data_result = struct.unpack('!12I', data)[10]
    return data_result - TIME_1970_OFFSET

def setSystemTime():
    ts = getTime()
    tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst = time.gmtime(ts)
    # SetSystemTime(year, month, day_of_week, day_of_month, hour, minute, second, wmilliseconds)
    win32api.SetSystemTime(tm_year, tm_mon, tm_wday, tm_mday, tm_hour, tm_min, tm_sec, 0)
    print("Set System OK!")

if __name__ == '__main__':
    setSystemTime()
    print("%d-%d-%d %d:%d:%d" % time.localtime(getTime())[:6])

第1步:构造 UDP 请求报文

目的:向网络授时服务器发送标准 NTP 查询包并获取原始时间戳数据。
入口:Python 脚本 getTime() 函数区域。
动作:初始化 datagram 套接字,拼接十六进制模式标记位 '\x1b' 与 47 个填充零字节,形成有效的 64 字节 NTP 客户端请求载荷。
重要参数:目标主机 TimeServer(默认 'pool.ntp.org')、通信端口 Port = 123。
可观察的完成状态:函数返回减去偏移量的正整数,控制台未抛出 OSError 或超时异常。

第2步:执行 SetSystemTime 写入系统时钟

目的:将获取到的 UTC 秒数转换为 Windows 可识别的日历结构体,并下发至操作系统内核。
入口:Python 脚本 setSystemTime() 函数区域。
动作:调用 time.gmtime() 解包时间戳,提取年、月、日、星期、时分秒等字段,传入 win32api.SetSystemTime 接口进行覆盖写入。
重要参数:星期序数 tm_wday 对应 API 第三个位置,毫秒值置为 0。
可观察的完成状态:终端打印 Set System OK!,随后执行机右下角系统时钟立即刷新为同步结果,脚本末尾输出格式化后的日期时间字符串验证一致性。

方法二:使用 ntplib 库配合命令行同步

当需要更稳定的 NTP 握手控制或集成到更大自动化流程中时,推荐直接使用封装完善的解析库。该方法将服务器响应中的发送时间戳提取后,利用内置时间格式化模块生成符合中文 Windows 命令提示符规范的字符串,再经由 os.system 调起双线命令完成日期与时段的合并设置。

import os
import time
import ntplib

c = ntplib.NTPClient()
response = c.request('pool.ntp.org')
ts = response.tx_time

_date = time.strftime('%Y-%m-%d', time.localtime(ts))
_time = time.strftime('%X', time.localtime(ts))

os.system(f'date {_date} && time {_time}')
print("Time synced successfully.")

第1步:安装 NTP 解析依赖库

目的:获取能正确处理 RFC-1305 协议握手、版本协商及 RTT 过滤的客户端工具。
入口:系统终端或包管理器命令行。
动作:执行标准 pip 安装指令下载编译好的 wheel 包。
重要参数:安装包名称 ntplib。
可观察的完成状态:终端显示 Successfully installed ntplib-xxx,导入测试无 ModuleNotFoundError。

第2步:请求时间戳并转换格式执行同步

目的:拉取绝对时间数据并按操作系统命令期望的格式拆分下发。
入口:脚本 NTPClient().request() 调用处。
动作:实例化客户端发起单次握手,截取响应对象中的 tx_time(发送时刻);使用 time.strftime 分别生成 ISO 标准日期串与 HH:MM:SS 时间串,拼接入 CMD 批处理语句一次性执行。
重要参数:日期格式 '%Y-%m-%d'、时间格式 '%X'、分隔符号 '&&'。
可观察的完成状态:命令窗口无红字报错静默退出,屏幕时间控件呈现最新校时结果,日志输出同步成功提示。

完成状态核对与异常排查

运行结束后,可通过桌面右下角时钟比对或与另一台已知准确设备交叉验证。若脚本报 PermissionError: [WinError 5] 拒绝访问,说明当前终端未提权,请重新打开 IDLE/PowerShell/CMD 并以管理员身份启动。若提示 socket.timeout 或 ConnectionRefusedError,通常为防火墙拦截 UDP 123 端口,可在入站规则中放行,或临时切换备用域名如 ntp.aliyun.com。部分企业域控环境会强制每隔一段时间自动回拨组策略时间源,此时本地脚本仅能短期生效,属架构预期行为。

简要总结

以上就是 Python 脚本设置系统时间的详细内容。两种方案各有侧重:原生 Socket 写法轻量透明,适合极简运行环境与二次开发;ntplib 配合命令行方案容错率更高、代码体积更小,便于融入 CI/CD 或日常巡检流水线。开发者可根据实际权限约束与依赖管理策略灵活选用。更多关于 Python 自动化运维的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。