最近公司的工控机产品遇到一个问题,工控机是离线使用的,但是客户对于时间要求又比较高,要精确到秒,不能有太大误差。所以怎么能快速授时这个问题一直萦绕在我脑海里...
一、前提描述
公司的应用程序是一个electron开发的桌面端应用程序,安装在windows10系统中,内网使用,不联网,并且没有wifi功能。
二、灵感来源
周末逛商场,看到一个卖家居的大卖场,路过一排时钟的货架,超级多好看的时钟,正在我惊叹于好久没看到这么多精美的时钟的时候,一个二维码赫然出现在我眼前,链接wifi后自动校时的wifi挂钟,手机共享热点也可以完成wifi链接

时钟联网调整时间
我心想,"我靠,我怎么没想到还能有这种操作?"
好吧,其实我之前想到了我们产品能怎么联网调整一下时间,但是思路受限就没有继续往下思考。
视频中是通过wifi进入一个设置网页,实现定时设置时间的。
三、解决思路
我想的是人为定期点击一个按钮,实现一键校准时间的功能:
- 1、手机通过usb数据线连接工控机usb接口,开启手机USB网络共享功能,让工控机联网
- 2、在设置界面添加"在线授时"按钮,弹窗提示实现授时流程
- 3、用户选择NTP服务器点击完成授时
关键点 就是ntp-client与sudo-prompt两个库的使用,ntp-client实现从NTP 服务器获取时间,sudo-prompt实现让Node.js/Electron 程序以「管理员 / 超级用户权限」执行系统命令,解决普通权限下无法操作系统级功能的问题。
遇到的小问题 ,测试过程中发现,命令行手动更新时间失败,原因是错误核心原因:Windows 系统区域 / 语言设置为中文(简体)时,date命令不识别MM-dd-yyyy(月 - 日 - 年)格式(如03-16-2026),中文环境下date命令默认要求「年月日」格式(如2026-03-16),导致执行date 03-16-2026提示 "系统无法接受输入的日期"。
此处关键 :美式区域用MM-dd-yyyy,中文区域用yyyy-MM-dd,月份与日需要前面补0

四、拓展学习NTP 授时(Network Time Protocol)
NTP(网络时间协议)是专门用于在计算机网络中同步所有设备系统时间的标准化网络协议,你可以把它理解成「网络世界的统一时间校准员」------ 解决不同设备(比如你的工控机、手机、服务器)因本地时钟漂移导致的时间不一致问题,是目前互联网最主流、精度最高的时间同步协议。
底层传输:基于 UDP 协议 (无连接、低延迟),固定使用123 端口,这是 IANA 为 NTP 专属分配的端口,所有合规 NTP 服务器都监听这个端口。

我是用的几个ntp服务器地址:
JavaScript
// 国内NTP服务器列表(按优先级排序)
const NTP_SERVERS = ['cn.pool.ntp.org', 'ntp1.aliyun.com', 'ntp.ntsc.ac.cn', 'time1.cloud.tencent.com', 'cn.ntp.org.cn'];
总结
随心记录,哈哈