Időkezelés

Időkezelés

A következőkben a ‘<time.h>’ fejfájl bekapcsolásával elérhető időkezelő függvényekre hozok példákat. Dátum és rendszeridő kiíratás, formázás, program futási idejének mérése, dátumok közt eltelt idő mérése.

 

Aktuális dátum, rendszeridő és másodpercekben eltelt idő kiíratása
time_t t;
time(&t);
struct tm aktualis_ido = *localtime(&t);
    
char buff[100];

// Kiírja a dátumot és a rendszeridőt a képernyőre
strftime(buff,64,"Dátum: %Y.%m.%d - rendszer idő: %H:%M:%S", &aktualis_ido);
printf("%s\n", buff);
    
// Másodpercekben eltelt idő <- 1970. január 1-je óta számolja
printf("%d másodperc telt el 1970 óta!\n", t);
printf("%d év telt el 1970 óta!\n", t / (60 * 60 * 24 * 365));

A fenti kód először is az aktuális dátumot és rendszeridőt íratja ki a kimenetre Y-m-d és H-M-S formában. Majd a time_t t; -> time(&t) -> t alkalmazásával az 1970 óta eltelt időt másodpercekben kaphatjuk meg. Amennyiben pl. az eltelt napokat szeretnénk megtudni: t/(60*60*24)-t kell megadnunk. Látható, hogy a példában években kértük az eltelt időt.

Programok futási idejének megmérése

 

1. difftime()

time_t kezd, veg;
time(&kezd);

//A program
for (int i = 0; i < 1000000000; i++);

time(&veg);
    
//Ciklus feldolgozása alatt eltelt másodpercek
double diff = difftime(veg,kezd);
printf("A program %.0f sec alatt futott le.\n", diff);

2. clock()

clock_t kezd = clock();

//A program
for (int i = 0; i < 1000000000; i++);

clock_t veg = clock();

//Ciklus feldolgozása alatt eltelt másodpercek
double diff = (double)(veg - kezd) / CLOCKS_PER_SEC;
printf("A program %.0f sec alatt futott le.\n", diff);

Amennyiben pontos mérést szeretnénk, a clock() függvény hasznosabb. A difftime() inkább nagyobb időközök, pl. napok megmérésére alkalmas. A alábbiakban erre hozok példákat.

Két dátum között eltelt idő mérése
//mettől?
int ev1 = 2001;
int ho1 = 11;
int na1 = 30;
//meddig?
int ev2 = 2020;
int ho2 = 3;
int na2 = 11;

time_t t, tt;
struct tm kezd = { 0 }, veg = { 0 };

//kezdő dátum
kezd.tm_year = ev1 - 1900;
kezd.tm_mon = ho1 - 1;
kezd.tm_mday = na1;

t = mktime(&kezd);

//vég dátum
veg.tm_year = ev2 - 1900;
veg.tm_mon = ho2 - 1;
veg.tm_mday = na2;
    
tt = mktime(&veg);

// A különbség kiíratása a képernyőre napokban számolva
double diff = difftime(tt/(60*60*24),t/(60*60*24));
printf("A két dátum között eltel napok száma: %.0f nap\n", diff);

// Ha kikötöttük, hogy egésszel kell visszatérnie a függvénynek, akkor
int kezd_ = t / (60*60*24);
int veg_ = tt / (60*60*24);
int diff_ = veg_ - kezd_;
printf("A két dátum között eltel napok száma: %d nap\n", diff_);

A fenti példában a két dátumot tetszőlegesen adtuk meg, ugyanakkor számos esetben az aktuális időt is be kell vonnunk a kezdő vagy vég időként a számításba. Erre példa az életkor megállapítása a születési dátum megadásával, ilyenkor a vég idő az aktuális rendszeridő. Egy másik példa, ha azt keressük, hogy egy adott dátumig mennyi időnek kell eltelnie. Ezekre láthatunk példákat az alábbiakban.

Életkor meghatározása
int szev = 1987;
int szho = 01;
int szn = 7;
int e, h, n;

time_t t, tt;
time(&tt);
struct tm sznap = { 0 }, most = *localtime(&tt);

//aktuális idő
e = most.tm_year + 1900;
h = most.tm_mon + 1;
n = most.tm_mday;
    
//születésnap
sznap.tm_year = szev - 1900;
sznap.tm_mon = szho - 1;
sznap.tm_mday = szn;

t = mktime(&sznap);

// Kiíratás
double diff = difftime(tt,t) / (60*60*24*365); //különbség sec-ben évekre átszámítva!
printf("Ön %.0f éves!\n", diff);
Hány nap van hátra karácsonyig?
int ev = 2020;
int ho = 12;
int nap = 24;

time_t t, tt;
time(&t);
struct tm most = *localtime(&t), akkor = { 0 };

// Karácsonykor
akkor.tm_year = ev - 1900;
akkor.tm_mon = ho - 1;
akkor.tm_mday = nap;
akkor.tm_hour = most.tm_hour; //pontosság miatt
akkor.tm_min = most.tm_min;
akkor.tm_sec = most.tm_sec;

tt = mktime(&akkor);

double diff = difftime(tt, t) / (60 * 60 * 24);
printf("%.0f nap van még karácsonyig!\n", diff); 
Dátum és idő formázása
time_t t;
time(&t);
struct tm most = *localtime(&t);

char buff[100];

strftime(buff,100,"Dátum/idő: %Y.%m.%d - %H:%M:%S",&most);

/* Dátum/idő: 2020.05.14 - 14:51:42
%A -> nap: pl.: csütörtök
%a -> nap pl.: cs
%c -> dátum és idő együtt: Dátum/idő: 2020. 05. 14. 14:58:15
A helyi beállítás setlocale() befolyásolja a kimenetet
%x -> ha nincs setlocale: HH/NN/EE, ha van: EEEE.HH.NN
%B -> hónap név: May, ha setlocale: május
%b -> hónap név: May, ha setlocale: máj.
%I -> 01-12 óra formátum
%H -> 00-23 óra formátum
%j -> az év hányadik napja 001-366 */