Nou Generator de prompt AI — scrie prompturi mai bune pentru ChatGPT, Claude și Gemini →

time.h (time, difftime, mktime, strftime) în C

Lucrul cu data și ora în C: momentul curent, diferența dintre două momente, structura struct tm și formatarea cu strftime.

Sintaxă
#include <time.h>
time_t time(time_t *t);
double difftime(time_t sfarsit, time_t inceput);
time_t mktime(struct tm *tm);
struct tm *gmtime(const time_t *t);   struct tm *localtime(const time_t *t);
size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);

Ce face time.h (time, difftime, mktime, strftime)

time(NULL) întoarce momentul curent ca time_t, de obicei numărul de secunde de la 1 ianuarie 1970, ora 00:00 UTC. difftime(b, a) întoarce diferența b - a în secunde, ca double; este modul portabil de a scădea două valori time_t.

struct tm desparte un moment în câmpuri: tm_year (anii de la 1900), tm_mon (0–11), tm_mday (1–31), tm_hour, tm_min, tm_sec, tm_wday (0 = duminică). gmtime și localtime transformă un time_t în struct tm (UTC, respectiv ora locală). mktime face invers, în ora locală, și normalizează câmpurile: 32 ianuarie devine 1 februarie.

strftime scrie data într-un buffer după un format: %Y anul, %m luna, %d ziua, %H:%M:%S ora. C23 a adăugat timegm, perechea lui mktime pentru UTC. Exemplele de mai jos folosesc date fixe, ca rezultatul să fie același la orice rulare.

Parametri

Parametru Descriere
t Adresa unui time_t (la time poate fi NULL).
tm Structura cu data despărțită pe câmpuri.
s, max, format La strftime: bufferul, mărimea lui și formatul.

Ce returnează

time/mktime: un time_t ((time_t)-1 la eroare). difftime: secunde ca double. strftime: numărul de caractere scrise (0 dacă nu încap).

Exemple

Exemplul 1: Câte zile au trecut între două momente

Valorile time_t sunt fixe: 1 ianuarie 2026 și 25 octombrie 2026, ora 00:00 UTC.

#include <stdio.h>
#include <time.h>

int main(void) {
    time_t inceput = 1767225600;   // 2026-01-01 00:00:00 UTC
    time_t acum = 1792886400;      // 2026-10-25 00:00:00 UTC
    double secunde = difftime(acum, inceput);
    printf("Au trecut %.0f secunde, adică %.0f zile\n", secunde, secunde / 86400);
    return 0;
}

Rezultat

Au trecut 25660800 secunde, adică 297 zile

Exemplul 2: Formatarea unei date cu strftime

gmtime nu depinde de fusul orar al calculatorului, deci rezultatul este același oriunde.

#include <stdio.h>
#include <time.h>

int main(void) {
    time_t moment = 1792929600;   // 2026-10-25 12:00:00 UTC
    struct tm *t = gmtime(&moment);
    char text[64];
    strftime(text, sizeof text, "%d.%m.%Y, ora %H:%M", t);
    printf("%s\n", text);
    strftime(text, sizeof text, "%Y-%m-%dT%H:%M:%SZ", t);
    printf("%s\n", text);
    printf("Ziua săptămânii (0 = duminică): %d\n", t->tm_wday);
    return 0;
}

Rezultat

25.10.2026, ora 12:00
2026-10-25T12:00:00Z
Ziua săptămânii (0 = duminică): 0

Exemplul 3: Data scadenței: azi + 45 de zile

Adunăm 45 la tm_mday (rezultă 70 octombrie), iar mktime normalizează data. Ora 12 și tm_isdst = -1 evită surprizele la trecerea la ora de iarnă.

#include <stdio.h>
#include <time.h>

int main(void) {
    struct tm data = {.tm_year = 2026 - 1900, .tm_mon = 10 - 1, .tm_mday = 25, .tm_hour = 12, .tm_isdst = -1};
    data.tm_mday += 45;
    mktime(&data);
    char text[32];
    strftime(text, sizeof text, "%d.%m.%Y", &data);
    printf("Factura este scadentă pe %s\n", text);
    return 0;
}

Rezultat

Factura este scadentă pe 09.12.2026

Greșeli frecvente

  • Uiți că tm_year numără anii de la 1900 și tm_mon începe de la 0: pentru 25 octombrie 2026 scrii tm_year = 126, tm_mon = 9.
  • Scazi două time_t direct și afișezi cu %d. Tipul time_t nu are o mărime fixată de standard; folosește difftime.
  • Păstrezi pointerul întors de gmtime/localtime și apelezi funcția din nou: ambele folosesc aceeași zonă statică, deci prima valoare este suprascrisă. Copiază structura (struct tm a = *gmtime(&t);).

Comenzi înrudite

  • rand și srand: Generează numere pseudo-aleatorii între 0 și RAND_MAX; srand alege punctul de pornire (seed).
  • struct: Grupează mai multe valori de tipuri diferite într-un singur tip nou, de exemplu numele, vârsta și orașul unei persoane.
  • snprintf și sprintf: Formatează text ca printf, dar îl scrie într-un tablou de caractere; snprintf nu depășește niciodată dimensiunea dată.
  • printf: Afișează text formatat pe ecran: un șablon cu specificatori (%d, %s, %.2f) completați cu valorile primite după el.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: time.h (time, difftime, mktime, strftime)

Ai o nelămurire despre utilizarea comenzii time.h (time, difftime, mktime, strftime) sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.