在Linux中使用C++设置系统日期和时间

Jac*_*kzz 8 c++ linux datetime

我正在开发一个跨平台应用程序,它将系统日期和时间更改为指定值.我已经完成了部分Windows.

如何从C++程序中设置系统日期和时间Linux?我正在寻找类似的功能SetSystemTime(SYSTEMTIME &x).

据我所知settimeofday(),对日期没有任何影响,我不确定函数的用法stime().我希望mktime()与我的需要无关.

有谁能够帮我.

Bas*_*tch 9

你理解错了.settimeofday(2)设置大纪元时间.这是日期和时间.阅读时间(7)

因此,如果从表示日期的字符串开始,将该字符串与strptime(3)struct tm转换为a 然后将其转换为使用mktime(3)的Unix时间,然后将其转换为settimeofday(即tv_sec字段).

但是,settimeofday需要root权限,我相信你通常应该避免调用它.最好在你的Linux PC上设置一些NTP客户端服务(例如运行ntpdchrony,更一般地阅读关于保持时间的系统管理员章节......).另见adjtimex(2)

顺便说一句,在多任务系统(如Linux或Windows)上突然改变系统时间是一项非常危险的操作(因为它会根据或使用时间来扰乱和干扰许多系统任务).这样做的理由很少(一般来说这是一个非常糟糕的主意).如果你这样做,那就用很少的程序和服务运行(例如单用户模式 Linux).你不应该在普通的应用程序代码中这样做.

  • 我真的不喜欢这个答案。尽管文档确实很明显地说明了如何实际调用该函数,但这是 stackoverflow 代码的 QA,所以说 RTFA,你不应该这样做,是一种伤害。正如评论中所指出的,在嵌入式系统中,这是完全合法的,并且会吓跑人们,因为在嵌入式服务器中设置运行 ntp 服务是不友好的。 (4认同)
  • 我正在做类似的事情,我从 gps 单元接收时间信息并需要更新系统时间。本机不支持 ntp。 (3认同)

gua*_*hen 5

我编写这段代码来设置Linux下的日期和时间。

struct tm time = { 0 };

time.tm_year = Year - 1900;
time.tm_mon  = Month - 1;
time.tm_mday = Day;
time.tm_hour = Hour;
time.tm_min  = Minute;
time.tm_sec  = Second;

if (time.tm_year < 0) time.tm_year = 0;

time_t t = mktime(&time);

if (t != (time_t) -1)
    stime(&t);
Run Code Online (Sandbox Code Playgroud)

请注意,这stime需要root特权。希望这可以帮助。

博申