Špatně to chápeš. settimeofday(2) nastavuje čas epochy. což je datum i čas. Doba čtení(7)
Pokud tedy začnete od řetězce vyjadřujícího datum, převeďte tento řetězec pomocí strptime(3) na struct tm
pak to převeďte na unixový čas pomocí mktime(3) a poté to vložte do settimeofday
(tj. tv_sec
pole).
Nicméně settimeofday
vyžaduje oprávnění root a domnívám se, že byste se obvykle měli vyvarovat jeho volání (alespoň na běžných počítačích připojených k internetu). Raději si na svém počítači s Linuxem nastavte nějakou službu klienta NTP (např. spusťte ntpd nebo chrony a obecně si přečtěte kapitolu sysadmin o udržování času...). Viz také adjtimex(2)
BTW, náhlá změna systémového času na multitaskingovém systému – jako je Linux nebo Windows – je velmi nebezpečná operace (protože naruší a naruší mnoho systémových úloh v závislosti na čase). Existuje několik dobrých důvodů, proč to udělat (obecně je to velmi špatný nápad). Pokud to uděláte, udělejte to s velmi malým počtem spuštěných programů a služeb (např. Linux v režimu jednoho uživatele). V běžném kódu aplikace byste to neměli dělat.
Píšu tento kus kódu pro nastavení data a času pod Linuxem.
#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);
}
Všimněte si, že stime
vyžaduje root
privilegia.