C语言如何用SetSystemTime修改系统时间?

99ANYc3cd6
预计阅读时长 22 分钟
位置: 首页 C语言 正文

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

c语言 setsystemtime
(图片来源网络,侵删)

在 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++):

c语言 setsystemtime
(图片来源网络,侵删)
  1. 将代码保存为 set_time_windows.c
  2. 打开命令行,编译代码:
    gcc -o set_time_windows set_time_windows.c
  3. 必须以管理员身份运行 生成的可执行文件:
    # 在命令行中右键,选择“以管理员身份运行”,然后执行
    .\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;
}

如何编译和运行:

c语言 setsystemtime
(图片来源网络,侵删)
  1. 将代码保存为 set_time_unix.c
  2. 编译代码:
    gcc -o set_time_unix set_time_unix.c
  3. 必须使用 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;
}

如何编译和运行:

  1. 将代码保存为 set_time_posix.c
  2. 编译代码:
    gcc -o set_time_posix set_time_posix.c
  3. 必须使用 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 直观

重要提醒:

  1. 权限是关键: 无论在哪个系统,修改系统时间都需要最高级别的权限,请务必确保你的程序以管理员/ root 身份运行。
  2. 谨慎操作: 错误地设置系统时间可能会导致依赖时间戳的服务(如日志、认证、数据库等)出现严重问题,在生产环境中执行此类操作前,请务必三思。
  3. 时区问题: SetSystemTimeclock_settime 都设置的是 UTC 时间,系统的本地时间是通过 UTC 和时区设置计算得出的,如果你只想修改本地时间而不影响 UTC,情况会更复杂,通常需要修改时区文件或调用其他特定 API。
-- 展开阅读全文 --
头像
百度分享插件织梦CMS版哪里下载?
« 上一篇 12-10
织梦dsql如何获取数据库10条数据?
下一篇 » 前天

相关文章

取消
微信二维码
支付宝二维码

目录[+]