Introdução

No POSIX o time.h pode ser utilizado ou a chamada de sistema time().

Este post falará brevemente com alguns snippets sobre como alterar a data e hora no Linux POSIX.

Estruturas de Tempo

O time_t é o tipo aritmético capaz de representar tempos. Embora não esteja definido, esse é quase sempre um valor integral (mas pode ser floating point) que contém o número de segundos (sem contar os segundos bissextos) desde 00:00, 1º de janeiro de 1970 UTC, correspondente à Era POSIX.

Já o tm é uma estrutura que contém uma data e hora de calendário dividida em seus componentes. A estrutura contém nove membros do tipo int (em qualquer ordem), que são:

MembroTipoDescriçãoIntervalo
tm_secintsegundos após o minuto0-60
tm_minintminutos após a hora0-59
tm_hourinthoras desde meia noite0-23
tm_mdayintdia do mês1-31
tm_monintmeses desde Janeiro0-11
tm_yearintanos desde 1900
tm_wdayintdias da semana desde Domingo0-6
tm_ydayintdias desde 1 de Janeiro0-365
tm_isdstintflag de Horário de Verão

O timespec é uma estrutura que contém um intervalo dividido em segundos e nanossegundos.

O cabeçalho <sys/time.h> define a estrutura timeval que inclui pelo menos os seguintes membros:

time_t         tv_sec      seconds
suseconds_t    tv_usec     microseconds

O cabeçalho <sys/time.h> define a estrutura itimerval que inclui pelo menos os seguintes membros:

struct timeval it_interval timer interval
struct timeval it_value    current value

O cabeçalho <sys/time.h> define a estrutura timezone que inclui pelo menos os seguintes membros:

int tz_minuteswest;     /* minutes west of Greenwich */
int tz_dsttime;         /* type of DST correction */

Obter a data e hora

Você pode verificar usando o comando date no terminal do Linux, ele devolve a data e hora do sistema operacional.

Para obter a hora usando o cabeçalho time.h, use a função gettimeofday e NULL para o fuso horário, ou use também a função time().

A função gettimeofday() obtém a hora atual, expressa em segundos e microssegundos desde 00:00 Coordinated Universal Time (UTC), 1º de janeiro de 1970, e a armazena na estrutura timeval.

#include <sys/time.h>

struct timeval tTime;
gettimeofday( &tTime, NULL);
std::cout << tTime.tv_sec << std::endl;
std::cout << tTime.tv_usec << std::endl;

Definir a data e hora

Para definir a hora usando o cabeçalho time.h, use a função settimeofday e o argumento NULL para o fuso horário.

A função settimeofday() é similar à gettimeofday(), porém define a hora ao invés de obter.

#include <sys/time.h>

struct timeval tnewTime;
int iReturn;

tnewTime.tv_sec = 1691067482; // O tempo em segundos é calculado a partir de alguma classe criada; aqui estamos assumindo um valor de tempo constante.
tnewTime.tv_usec = 0;

iReturn = settimeofday( & tnewTime , NULL );

if ( iReturn == 0 )
{
    system("hwclock --systohc");
}

Para atualizar a hora do rtc no hardware, use o hwclock -w ou hwclock --systohc. Assim, o aplicativo funciona no espaço do usuário e atualiza a hora do sistema e, posteriormente, é necessária uma sincronização para atualizar o relógio do hardware.

Ou seja, o horário do sistema operacional foi definido com a função settimeofday() e depois o horário do hardware é atualizado com o horário do sistema com a chamada de sistema hwclock --systohc.

Para verificar a hora do rtc no hardware, use o comando hwclock.

Se você quiser alterar o relógio do hardware e atualizar a hora do sistema, use o comando hwclock -s ou hwclock --hctosys.

É necessário atualizar a data e hora do hardware, pois ao iniciar o dispositivo, o sistema operacional obtém a data e hora do hardware. Caso não seja atualizado, ele sempre iniciará com as definições antigas.

Opinião

Use sempre as opções que descrevem a intenção do argumento, por exemplo, utilizar o hwclock --systohc, pois você está realizando a operação do sys para o hc (hardware clock). Já com hwclock -w, o argumento -w pode significar uma infinidade de coisas.

No Linux as opções das chamadas de sistema geralmente fornecem duas possibilidades, como no caso do hwclock de -w e --systohc, sempre opte pela semântica.

Referência