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

时间:2015-02-04 06:06:28

标签: c++ linux datetime

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

如何在C++的{​​{1}}程序中设置系统日期和时间?我正在寻找类似于Linux的函数。

据我所知,SetSystemTime(SYSTEMTIME &x)对日期没有任何作用,我不确定函数settimeofday()的用法。我希望stime()与我的需要无关。

任何人都可以帮助我。

3 个答案:

答案 0 :(得分:5)

你理解错了。 settimeofday(2)正在设置Epoch time。这是日期和时间。阅读time(7)

因此,如果您从表示日期的字符串开始,请将该字符串与strptime(3)转换为struct tm,然后将其转换为带有mktime(3)的Unix时间,然后将其转换为{{ 1}}(即settimeofday字段)。

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

BTW,在类似multi-tasking系统的Linux或Windows上突然改变系统时间是一项非常危险的操作(因为它会根据或使用时间来扰乱和干扰很多系统任务)。这样做的理由很少(一般来说这是一个非常糟糕的主意)。如果你这样做,那就用很少的程序做到这一点。运行的服务(例如single user mode Linux)。你不应该在普通的应用程序代码中这样做。

答案 1 :(得分:1)

我在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);

请注意,stime需要root权限。希望这会有所帮助。

博深

答案 2 :(得分:0)

使用 clock_settime 而不是 stime 的示例,因为正如 Mehmet Fide 指出的那样,stime 现在是 deprecated。我喜欢 Converting between timespec & std::chrono 的参考代码:

#include <time.h>
#include <chrono>

using std::chrono; // for example brevity

constexpr timespec timepointToTimespec(
    time_point<system_clock, nanoseconds> tp)
{
    auto secs = time_point_cast<seconds>(tp);
    auto ns = time_point_cast<nanoseconds>(tp) -
             time_point_cast<nanoseconds>(secs);

    return timespec{secs.time_since_epoch().count(), ns.count()};
}

const char* timePointToChar(
    const time_point<system_clock, nanoseconds>& tp) {
    time_t ttp = system_clock::to_time_t(tp);
    return ctime(&ttp);
}

const time_point system_time = system_clock::now();
cout << "System time = " << timePointToChar(system_time) << endl;

const timespec ts = timepointToTimespec(system_time);
clock_settime(CLOCK_REALTIME, &ts);