Entiendes mal. settimeofday(2) está configurando la hora de Epoch. que es tanto la fecha como la hora. Tiempo de lectura(7)
Entonces, si comienza desde una cadena que expresa una fecha, convierta esa cadena con strptime (3) en un struct tm
luego conviértalo a un tiempo de Unix con mktime (3) y luego aliméntelo a settimeofday
(es decir, el tv_sec
campo).
Sin embargo, settimeofday
requiere privilegios de root y creo que por lo general debe evitar llamarlo (al menos en las computadoras habituales conectadas a Internet). Mejor configure algún servicio de cliente NTP en su PC con Linux (por ejemplo, ejecute ntpd o chrony y, de manera más general, lea el capítulo de administración de sistemas sobre cómo mantener el tiempo...). Véase también adjtimex(2)
Por cierto, cambiar abruptamente la hora del sistema en un sistema multitarea -como Linux o Windows- es una operación muy peligrosa (ya que alterará y perturbará muchas tareas del sistema dependiendo o usando la hora). Hay pocas buenas razones para hacer eso (es una muy mala idea en general). Si hace eso, hágalo con muy pocos programas y servicios en ejecución (por ejemplo, modo de usuario único Linux). No debe hacer eso en el código de aplicación ordinario.
Escribo este fragmento de código para establecer la fecha y la hora en 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);
}
Tenga en cuenta que stime
requiere root
privilegios.