下面我将分别介绍在 Windows 和 Linux/macOS 系统中如何使用 C 语言设置系统时间。

(图片来源网络,侵删)
在 Windows 系统中设置系统时间
在 Windows 上,最常用的函数是 SetSystemTime,这个函数需要管理员权限才能成功执行。
核心函数:SetSystemTime
- 头文件:
<windows.h> - 函数原型:
BOOL SetSystemTime(const SYSTEMTIME *lpSystemTime);
- 参数:
lpSystemTime: 指向一个SYSTEMTIME结构体的指针,该结构体包含了你要设置的新日期和时间。
- 返回值:
- 如果成功,返回
TRUE。 - 如果失败,返回
FALSE,可以使用GetLastError()函数获取具体的错误码。
- 如果成功,返回
- 重要:
- 此函数设置的是 UTC (协调世界时),而不是本地时间。
- 程序必须以 管理员权限 运行。
SYSTEMTIME 结构体
typedef struct _SYSTEMTIME {
WORD wYear; // 年 ( 2025)
WORD wMonth; // 月 (1-12)
WORD wDayOfWeek; // 星期几 (0-6, 0=星期日)
WORD wDay; // 日 (1-31)
WORD wHour; // 时 (0-23)
WORD wMinute; // 分 (0-59)
WORD wSecond; // 秒 (0-59)
WORD wMilliseconds; // 毫秒 (0-999)
} SYSTEMTIME, *PSYSTEMTIME;
注意: wDayOfWeek 字段在 SetSystemTime 中会被忽略,系统会根据年、月、日自动计算。
示例代码
下面的代码示例将系统时间设置为 2025年10月27日 15:30:00 (UTC)。
#include <windows.h>
#include <stdio.h>
int main() {
// 1. 检查是否以管理员权限运行
// 这是一个简单的检查,实际应用中可能需要更健壮的方式
BOOL isAdmin = FALSE;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
if (AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup)) {
if (!CheckTokenMembership(NULL, AdministratorsGroup, &isAdmin)) {
isAdmin = FALSE;
}
FreeSid(AdministratorsGroup);
}
if (!isAdmin) {
printf("错误:此程序需要管理员权限才能运行,\n");
printf("请以管理员身份重新启动此程序,\n");
return 1;
}
// 2. 定义要设置的时间 (UTC时间)
SYSTEMTIME st;
st.wYear = 2025;
st.wMonth = 10;
st.wDay = 27;
st.wDayOfWeek = 0; // 此字段将被忽略
st.wHour = 15;
st.wMinute = 30;
st.wSecond = 0;
st.wMilliseconds = 0;
// 3. 调用 SetSystemTime 函数
printf("正在尝试将系统时间设置为 UTC 2025-10-27 15:30:00...\n");
if (SetSystemTime(&st)) {
printf("系统时间设置成功!\n");
} else {
printf("系统时间设置失败!错误码: %lu\n", GetLastError());
return 1;
}
return 0;
}
如何编译和运行 (使用 MinGW/g++):

(图片来源网络,侵删)
- 将代码保存为
set_time_windows.c。 - 打开命令行,编译代码:
gcc -o set_time_windows set_time_windows.c
- 必须以管理员身份运行 生成的可执行文件:
# 在命令行中右键,选择“以管理员身份运行”,然后执行 .\set_time_windows.exe
在 Linux / macOS 系统中设置系统时间
在 Linux 和 macOS 等类 Unix 系统中,设置系统时间通常需要超级用户(root)权限,标准 C 库没有提供直接修改系统时间的函数,但我们可以通过调用系统命令来实现,最常用的命令是 date。
使用 system() 函数调用 date 命令
这是最简单直接的方法。system() 函数会启动一个子 shell 来执行指定的命令。
- 头文件:
<stdlib.h> - 命令格式:
date --set="YYYY-MM-DD HH:MM:SS" - 权限: 需要
root权限。
示例代码
下面的代码示例将系统时间设置为 2025年10月27日 15:30:00。
#include <stdio.h>
#include <stdlib.h> // 用于 system() 函数
int main() {
// 定义要设置的时间字符串
// 格式: "YYYY-MM-DD HH:MM:SS"
char time_command[100];
sprintf(time_command, "date --set=\"2025-10-27 15:30:00\"");
printf("正在尝试执行命令: %s\n", time_command);
printf("注意:此命令需要 root 权限,\n");
// 调用 system() 执行命令
int result = system(time_command);
// 检查命令是否执行成功
// system() 返回 -1 表示调用失败,返回 WEXITSTATUS(result) 获取子进程的退出状态
if (result == -1) {
perror("执行 system() 失败");
return 1;
} else if (WEXITSTATUS(result) != 0) {
printf("命令执行失败,可能是因为权限不足,\n");
printf("请尝试使用 sudo 运行此程序,\n");
return 1;
} else {
printf("系统时间设置成功!\n");
}
return 0;
}
如何编译和运行:

(图片来源网络,侵删)
- 将代码保存为
set_time_unix.c。 - 编译代码:
gcc -o set_time_unix set_time_unix.c
- 必须使用
sudo以 root 权限运行:sudo ./set_time_unix
更底层的 clock_settime 函数 (POSIX 标准)
对于更严肃的应用程序,直接调用系统命令可能不是最佳选择(因为它依赖于 shell 的存在),POSIX 标准提供了 clock_settime 函数,这是一个更底层的、更可控的方法。
- 头文件:
<time.h> - 函数原型:
int clock_settime(clockid_t clock_id, const struct timespec *tp);
- 参数:
clock_id: 指定要设置哪个时钟,对于设置系统时间,通常使用CLOCK_REALTIME。tp: 指向struct timespec结构体的指针,它包含秒和纳秒。
- 权限: 需要
CAP_SYS_TIME能力(在 root 下运行时会自动拥有)。 - 注意:
clock_settime设置的是 UTC 时间。
示例代码
#include <stdio.h>
#include <time.h> // 用于 clock_settime 和 timespec
#include <stdlib.h> // 用于 exit
#include <unistd.h> // 用于 _POSIX_C_SOURCE 检查
int main() {
// 定义新的时间 (UTC时间)
// 注意:timespec 使用秒和纳秒
struct timespec new_time;
new_time.tv_sec = 1698381000; // 这是 2025-10-27 15:30:00 UTC 对应的 Unix 时间戳
new_time.tv_nsec = 0; // 纳秒部分
// 调用 clock_settime
printf("正在尝试使用 clock_settime 设置系统时间...\n");
printf("注意:此程序需要 root 权限,\n");
if (clock_settime(CLOCK_REALTIME, &new_time) == 0) {
printf("系统时间设置成功!\n");
} else {
perror("clock_settime 失败");
printf("错误:请确保程序以 root 权限运行,\n");
exit(EXIT_FAILURE);
}
return 0;
}
如何编译和运行:
- 将代码保存为
set_time_posix.c。 - 编译代码:
gcc -o set_time_posix set_time_posix.c
- 必须使用
sudo以 root 权限运行:sudo ./set_time_posix
总结与注意事项
| 特性 | Windows (SetSystemTime) |
Linux/macOS (system("date ...")) |
Linux/macOS (clock_settime) |
|---|---|---|---|
| 平台 | Windows | Linux / macOS | POSIX 兼容系统 (Linux, macOS 等) |
| 头文件 | <windows.h> |
<stdlib.h> |
<time.h> |
| 权限 | 管理员权限 | root 权限 | root 权限 |
| 时间标准 | UTC | 本地时间 (取决于 date 命令的默认行为) |
UTC |
| 优点 | 原生 API,直接高效 | 简单,无需了解复杂结构 | 标准 POSIX API,底层,可靠 |
| 缺点 | 仅限 Windows | 依赖 shell,安全性较低,可移植性差 | 需要计算 Unix 时间戳,结构体不如 SYSTEMTIME 直观 |
重要提醒:
- 权限是关键: 无论在哪个系统,修改系统时间都需要最高级别的权限,请务必确保你的程序以管理员/ root 身份运行。
- 谨慎操作: 错误地设置系统时间可能会导致依赖时间戳的服务(如日志、认证、数据库等)出现严重问题,在生产环境中执行此类操作前,请务必三思。
- 时区问题:
SetSystemTime和clock_settime都设置的是 UTC 时间,系统的本地时间是通过 UTC 和时区设置计算得出的,如果你只想修改本地时间而不影响 UTC,情况会更复杂,通常需要修改时区文件或调用其他特定 API。
