Du verstehst falsch. settimeofday(2) setzt die Epochenzeit. das ist sowohl Datum als auch Uhrzeit. Lesezeit(7)
Wenn Sie also mit einem String beginnen, der ein Datum ausdrückt, konvertieren Sie diesen String mit strptime(3) in einen struct tm
Konvertieren Sie diese dann mit mktime(3) in eine Unix-Zeit und füttern Sie diese dann mit settimeofday
(also die tv_sec
Feld).
Allerdings settimeofday
erfordert Root-Privilegien und ich glaube, Sie sollten es normalerweise vermeiden, es aufzurufen (zumindest auf normalen, mit dem Internet verbundenen Computern). Richten Sie besser einen NTP-Client-Dienst auf Ihrem Linux-PC ein (z. B. führen Sie ntpd oder chrony aus und lesen Sie allgemein das Sysadmin-Kapitel zum Halten der Zeit ...). Siehe auch adjtimex(2)
Übrigens, das abrupte Ändern der Systemzeit auf einem Multitasking-System - wie Linux oder Windows - ist eine sehr gefährliche Operation (da es viele Systemaufgaben stören und stören wird, abhängig von oder mit der Zeit). Es gibt wenige gute Gründe dafür (es ist im Allgemeinen eine sehr schlechte Idee). Wenn Sie dies tun, tun Sie dies mit sehr wenigen laufenden Programmen und Diensten (z. B. Linux im Einzelbenutzermodus). Sie sollten dies nicht in gewöhnlichem Anwendungscode tun.
Ich schreibe diesen Code, um Datum und Uhrzeit unter Linux einzustellen.
#include <time.h>
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);
}
Beachten Sie, dass stime
erfordert root
Privilegien.