C程序中ctime()函数返回时间错误,偏差达3天
WSL2中C语言time函数输出时间与Windows主机偏差3天的原因分析
问题复现
代码示例:
#include<stdio.h> #include<time.h> int main(void){ time_t now = time(NULL); printf("%s", ctime(&now)); return 0; }
在Windows 11系统的WSL2环境下,用GCC编译运行上述代码后,输出时间为Wed May 10 19:13:18 2023,但Windows主机实际系统时间为Sat May 13 09:45:37 2023,二者偏差3天,且已排除UTC/本地时间差异问题。
核心原因
- WSL2虚拟机时钟未同步主机休眠/挂起后的时间:WSL2本质是基于Hyper-V的轻量虚拟机,当Windows主机进入休眠、睡眠或长时间挂起状态时,WSL2的虚拟机会暂停运行,时钟停留在主机休眠前的时间点。主机恢复运行后,WSL2虚拟机不会自动同步主机的最新时间,从而产生时间差。
- 缺少自动时间同步机制:WSL默认未启用定期同步主机时间的配置,如果主机在WSL未运行期间修改过系统时间(比如手动调整、跨时区切换),WSL启动后不会主动拉取主机的最新时间,导致时间偏差持续存在。
- Hyper-V虚拟机时钟漂移:Hyper-V虚拟机本身存在一定的时钟漂移问题,当WSL2长期运行后,虚拟系统时钟会逐渐和主机时间产生偏差,且没有自动校准机制来修正。
快速修复方案
临时同步可在WSL终端执行:
sudo hwclock -s
长期自动同步可在WSL的/etc/wsl.conf文件中添加以下配置(若文件不存在则新建):
[boot] command="hwclock -s"
这样每次WSL启动时都会自动同步主机硬件时钟。
内容的提问来源于stack exchange,提问作者Dabbo
相关产品推荐
相关产品推荐

