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_yearnumără anii de la 1900 șitm_monîncepe de la 0: pentru 25 octombrie 2026 scriitm_year = 126,tm_mon = 9. - Scazi două
time_tdirect și afișezi cu%d. Tipultime_tnu are o mărime fixată de standard; foloseștedifftime. - 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.
Î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.