我正在开发一个跨平台应用程序,它将系统日期和时间更改为指定值。我已完成Windows
的部分。
如何在C++
的{{1}}程序中设置系统日期和时间?我正在寻找类似于Linux
的函数。
据我所知,SetSystemTime(SYSTEMTIME &x)
对日期没有任何作用,我不确定函数settimeofday()
的用法。我希望stime()
与我的需要无关。
任何人都可以帮助我。
答案 0 :(得分:5)
你理解错了。 settimeofday(2)正在设置Epoch time。这是日期和时间。阅读time(7)
因此,如果您从表示日期的字符串开始,请将该字符串与strptime(3)转换为struct tm
,然后将其转换为带有mktime(3)的Unix时间,然后将其转换为{{ 1}}(即settimeofday
字段)。
但是,tv_sec
需要root权限,我相信你通常应该避免调用它。最好在Linux PC上设置一些NTP客户端服务(例如,运行ntpd或chrony,更一般地阅读keeping time上的系统管理员章节...)。另请参阅adjtimex(2)
答案 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);