C esetén a dátum és időkezelés szorosan egybekapcsolódik a Unix dátum és időkezelésével. A Unix alapú rendszerek és a C programok időszámítása az UTC szerinti 1970 január 1 0 óra 0 perctől eltelt másodperceken alapul. Az ezen időpont óta eltelt másodperceket nevezzük a Unix időnek. A Unix időt a time.h header-ben definált time függvénnyel tudjuk lekérdezni, aminek paraméterként egy time_t típusú változót kell adnunk.
Ezt az időt a localtime hívással tudjuk helyi időre konvertálni. Ez már figyelembe veszi a gép időzónáját is. Ez egy tm struktúra mutatót fog visszaadni, ami az időre vonatkozó információkat tárolja. Ezt a struktúrát emberileg is olvasható dátum és idő formátumra az asctime függvény meghívásával tudjuk konvertálni.
Nézzük ezt meg a gyakorlatban:
#include <stdio.h>
#include <time.h>
int main()
{
time_t unixTime;
struct tm *localTime;
time(&unixTime);
localTime = localtime(&unixTime);
printf("Unix ido: %lld\r\n", unixTime);
printf("Helyi ido: %s\r\n", asctime(localTime));
return (0);
}
A tm típus elé ki kell tennünk a struct kulcsszót, mivel nem typedef-el definiált. A tm struktúra az alábbi tagokból áll:
struct tm {
int tm_sec; /* seconds, range 0 to 59 */
int tm_min; /* minutes, range 0 to 59 */
int tm_hour; /* hours, range 0 to 23 */
int tm_mday; /* day of the month, range 1 to 31 */
int tm_mon; /* month, range 0 to 11 */
int tm_year; /* The number of years since 1900 */
int tm_wday; /* day of the week, range 0 to 6 */
int tm_yday; /* day in the year, range 0 to 365 */
int tm_isdst; /* daylight saving time */
};
A program kimenete valami hasonló lesz:
Unix ido: 1699805464
Helyi ido: Sun Nov 12 17:11:04 2023
Az asctime beégetetten angol formátummal dolgozik. Ha az időt szeretnénk formázni, akkor az strftime függvénnyel tudjuk szöveggé formázni megadott formátum szerint a dátumot és időt. A függvény első paramétere egy buffer, amibe írjuk a formázott szöveget, a második paraméter a buffer hossza karakterekben, a harmadik paramétere a formátum és a negyedik pedig a konvertálandó tm struktúra:
char buffer[80];
strftime(buffer, sizeof(buffer) / sizeof(char), "%c", localTime);
A használható formátumjelölők:
| Formátum | Leírás |
|---|---|
%a |
Rövidített nap név |
%A |
Teljes nap név |
%b |
Rövidített hónap név |
%B |
Teljes hónap név |
%c |
Dátum és idő megjelenítése |
%d |
Hónap napja két számjeggyel |
%H |
Óra 24 órás formátumban két számjeggyel |
%I |
Óra 12 órás formátumban két számjeggyel |
%j |
Év napja 3 számjeggyel |
%m |
Hónap száma két számjegyen |
%M |
Percek két számjegyen |
%p |
AM vagy PM |
%S |
Másodpercek két számjegyen |
%Z |
Időzóna neve vagy rövidítése |
%U |
A hét száma vasárnappal induló hét esetén |
%w |
A hét napja. Vasárnap = 0, Szombat = 6 |
%W |
A hét száma hétfővel induló hét esetén |
%x |
Dátum 08/19/12 formátumban |
%X |
Idő 02:50:06 formátumban |
%y |
Év utolsó két számjegye |
%Y |
Év |
%% |
A % jel |