本文目录导读:

- Linux 系统(使用
ntpdate或chrony) - Windows 系统(PowerShell 或 CMD)
- macOS 系统(使用
sntp) - 跨平台通用脚本(利用 Python)
- 物联网/嵌入式设备(Shell 脚本)
- 使用建议与注意事项
Linux 系统(使用 ntpdate 或 chrony)
方法 A:使用 ntpdate(传统、简单)
如果你的系统安装了 ntpdate,可以直接使用:
#!/bin/bash # 同步系统时间 # 使用多个 NTP 服务器,如果第一个失败,尝试下一个 sudo ntpdate -u cn.pool.ntp.org || sudo ntpdate -u ntp.ubuntu.com || sudo ntpdate -u pool.ntp.org
说明:
-u参数绕过防火墙限制(使用非特权端口)。- 如果成功,系统时间会立即更新。
- 建议配合
cron任务(如每天凌晨执行)使用。
方法 B:使用 chrony(现代、推荐)
在大多数新 Linux 发行版(如 Ubuntu 18.04+, CentOS 8+)中,推荐使用 chrony:
#!/bin/bash # 强制立即同步(-I 选项) sudo chronyc makestep # 或者等待自动同步(通常只需几秒) # sudo chronyc waitsync 30
说明:
- 前提是系统已安装并启用了
chronyd服务。 makestep会立即进行时间跳变(适合刚开机或时间偏差大时)。- 使用
cron或systemd timer定期执行。
一键脚本(适用于 DEB/RPM 兼容系统):
#!/bin/bash
# 自动选择可用的同步工具
if command -v chronyc &> /dev/null; then
sudo chronyc makestep
elif command -v ntpdate &> /dev/null; then
sudo ntpdate -u pool.ntp.org
elif command -v timedatectl &> /dev/null; then
# 尝试使用 systemd-timesyncd
sudo timedatectl set-ntp true
sudo timedatectl status
else
echo "未找到合适的时间同步工具,请安装 chrony 或 ntpdate"
exit 1
fi
Windows 系统(PowerShell 或 CMD)
方法 A:使用 PowerShell(推荐)
# 同步系统时间(需要管理员权限) # 强制立即同步并更新 w32tm /resync /force
高级版本(修改时间服务器并同步):
# 以管理员身份运行 # 设置 NTP 服务器为阿里云或国家授时中心 w32tm /config /manualpeerlist:"ntp.aliyun.com,0x8 time.nist.gov,0x8" /syncfromflags:manual /update # 强制重新同步 w32tm /resync /rediscover
方法 B:使用批处理(CMD)
@echo off
echo 正在同步系统时间...
w32tm /resync /force
if %errorlevel% equ 0 (
echo 时间同步成功!
) else (
echo 同步失败,请检查网络或权限。
)
pause
说明:
- 必须以管理员身份运行,否则会报错(错误码 5)。
- 该命令在 Windows 10/11 和 Windows Server 2016+ 上有效。
macOS 系统(使用 sntp)
#!/bin/bash # macOS 同步时间 # 需要管理员权限 sudo sntp -sS time.apple.com # 或者使用系统自带的时间服务 # sudo systemsetup -setusingnetworktime on # sudo systemsetup -setnetworktimeserver time.apple.com
说明:
-s表示只设置一次(不进入守护进程模式)。-S立即生效。- 如果系统启用了“日期与时间 > 自动设置”(System Preferences),通常无需手动同步。
跨平台通用脚本(利用 Python)
#!/usr/bin/env python3
# 用途:简单的 HTTP 时间同步(不依赖系统 NTP 服务)
# 原理:通过 HTTP 响应头获取时间
import requests
import socket
import struct
import time
def sync_via_http():
# 方式1:使用 HTTP 请求头(最可靠)
try:
r = requests.get('https://www.baidu.com', timeout=5)
# 解析标准化的 Date 头
server_time = r.headers['date']
# 转换为本地时间并直接设置(需要权限)
# 注意:Python 无法直接设置系统时间,需要调用系统命令
print(f"服务器时间: {server_time}")
# 这里可以调用系统命令:ntpdate、date 等
return True
except:
return False
# 或者实现 SNTP 协议(更精确)
def sync_via_sntp(server="ntp.aliyun.com"):
# SNTP 协议实现(简化版)
NTP_DELTA = 2208988800 # 1900-1970 年的秒数差
try:
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.settimeout(2)
# 构造 NTP 请求包(RFC 4330)
data = b'\x1b' + 47 * b'\0'
client.sendto(data, (server, 123))
response, _ = client.recvfrom(1024)
t = struct.unpack("!12I", response)[10] - NTP_DELTA
print(f"NTP 服务器时间(Unix时间戳): {t}")
# 在此处调用系统命令设置时间
return True
except:
return False
if __name__ == "__main__":
sync_via_sntp()
物联网/嵌入式设备(Shell 脚本)
#!/bin/sh
# 适用于 BusyBox / OpenWrt 等精简系统
# 需要具有 root 权限
# 方式1:使用 busybox 自带的 ntpdate
busybox ntpdate -n -p 4 0.cn.pool.ntp.org
# 方式2:直接通过 TCP 获取 HTTP 时间(精简版)
# 使用日期命令的解析功能(需依赖 wget 或 curl)
echo "Retrieving time from HTTP..."
SERVER_TIME=$(curl -sI --max-time 5 https://www.qq.com | grep -i '^date:' | cut -d' ' -f2-)
if [ -n "$SERVER_TIME" ]; then
date -s "$SERVER_TIME"
echo "时间已同步: $SERVER_TIME"
fi
使用建议与注意事项
-
权限问题:修改系统时间通常需要 root/管理员 权限,脚本中应使用
sudo或以管理员身份运行。 -
服务器选择:
- 中国地区常用:
ntp.aliyun.com、ntp.tencent.com、cn.pool.ntp.org - 国际通用:
pool.ntp.org、time.google.com、time.apple.com
- 中国地区常用:
-
定时执行:
- Linux:添加 crontab 任务(
sudo crontab -e),例如每天凌晨 3 点执行:0 3 * * * /path/to/your_script.sh - Windows:使用任务计划程序。
- Linux:添加 crontab 任务(
-
防火墙:如果使用 NTP(UDP 123端口)被防火墙阻塞,建议使用
-u参数(Linux ntpdate)或改为 HTTP/HTTPS 时间同步。 -
虚拟环境:虚拟机同步时间有时会出现偏差,建议在宿主机上开启时间同步功能,然后在虚拟机内禁用 NTP 服务以避免冲突。
如果只是经常手动同步,推荐使用 Linux 的 chrony 或 Windows 的 w32tm 通过任务计划程序,这样可以自动保持系统时间准确。