Vous comprenez mal. settimeofday(2) définit l'heure de l'époque. qui est à la fois la date et l'heure. Temps de lecture(7)
Donc, si vous partez d'une chaîne exprimant une date, convertissez cette chaîne avec strptime(3) en un struct tm
puis convertissez-le en heure Unix avec mktime(3) puis alimentez-le en settimeofday
(c'est-à-dire le tv_sec
champ).
Cependant, settimeofday
nécessite le privilège root et je pense que vous devriez généralement éviter de l'appeler (au moins sur les ordinateurs habituels connectés à Internet). Mieux vaut définir un service client NTP sur votre PC Linux (par exemple, exécutez ntpd ou chrony et plus généralement lisez le chapitre sysadmin sur le maintien de l'heure ...). Voir aussi adjtimex(2)
BTW, changer brusquement l'heure système sur un système multi-tâches - comme Linux ou Windows - est une opération très dangereuse (car elle perturbera et perturbera de nombreuses tâches système en fonction ou en utilisant le temps). Il y a peu de bonnes raisons de le faire (c'est une très mauvaise idée en général). Si vous faites cela, faites-le avec très peu de programmes et de services en cours d'exécution (par exemple, Linux en mode mono-utilisateur). Vous ne devriez pas faire cela dans le code d'application ordinaire.
J'écris ce morceau de code pour définir la date et l'heure sous 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);
}
Notez que stime
nécessite root
privilèges.