Hai capito male. settimeofday(2) imposta l'ora dell'epoca. che è sia la data che l'ora. Tempo di lettura(7)
Quindi, se inizi da una stringa che esprime una data, converti quella stringa con strptime(3) in un struct tm
quindi convertilo in un orario Unix con mktime(3) quindi passalo a settimeofday
(ovvero il tv_sec
campo).
Tuttavia, settimeofday
richiede il privilegio di root e credo che di solito dovresti evitare di chiamarlo (almeno sui normali computer connessi a Internet). Meglio impostare un servizio client NTP sul tuo PC Linux (ad esempio eseguire ntpd o chrony e più in generale leggere il capitolo sysadmin su come tenere il tempo ...). Vedi anche adjtimex(2)
A proposito, cambiare bruscamente l'ora di sistema su un sistema multi-tasking, come Linux o Windows, è un'operazione molto pericolosa (poiché sconvolgerà e disturberà molte attività di sistema a seconda o utilizzando l'ora). Ci sono poche buone ragioni per farlo (è una pessima idea in generale). Se lo fai, fallo con pochissimi programmi e servizi in esecuzione (ad esempio Linux in modalità utente singolo). Non dovresti farlo nel normale codice dell'applicazione.
Scrivo questo pezzo di codice per impostare data e ora sotto Linux.
#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);
}
Nota che stime
richiede root
privilegi.