1. Sissejuhatus
C-keeles programmeerimisel tuleb sageli töötada kuupäeva- ja kellaajaga seotud andmetega. Üks sagedamini kasutatavaid funktsioone on localtime
. See funktsioon on kasulik kohaliku aja hankimiseks, arvestades ajavööndit. Algajatele võib aga selle kasutamine ja tähelepanekud olla esialgu veidi segased.
Selles artiklis selgitame lihtsas keeles localtime
funktsiooni põhilist kasutamist, praktilisi näiteid ja olulisi tähelepanekuid. Isegi algajad saavad sellest aru, sest lisame konkreetseid näiteid – loe kindlasti lõpuni!
2. Mis on localtime
funktsioon?
localtime
funktsiooni ülevaade
localtime
on C-keele standardteegi ajaga seotud funktsioon, mida kasutatakse laialdaselt nii POSIX- kui ka Windowsi keskkondades. See teisendab time_t
tüüpi ajatemplid kohalikuks ajaks (struct tm
), arvestades ajavööndit.
time_t
ja struct tm
seos
C-keeles kasutatakse aja käsitlemisel kahte põhitüüpi:
time_t
: sekundite arv alates 1. jaanuarist 1970 kell 00:00:00 (UTC).struct tm
: struktuur, mis hoiab aja komponente eraldi väljadena (aasta, kuu, päev, tund, minut, sekund).
localtime
teisendab need tüübid teineteiseks.
Funktsiooni prototüüp
#include <time.h>
struct tm *localtime(const time_t *timer);
Tagastab kohaliku aja, lähtudes time_t
väärtusest, mis antakse timer
kaudu viitena.
3. localtime
funktsiooni põhiline kasutamine
Lihtne näide
Järgmine näide hangib praeguse aja ja teisendab selle kohalikuks ajaks.
#include <time.h>
#include <stdio.h>
int main() {
time_t t = time(NULL); // Hangi praegune aeg
struct tm *local = localtime(&t); // Teisenda kohalikuks ajaks
printf("Praegune aeg: %02d:%02d:%02dn",
local->tm_hour, local->tm_min, local->tm_sec);
return 0;
}
Koodi selgitus
time(NULL)
hangib praeguse UNIXi ajatembli.localtime
teisendab sellestruct tm
tüüpi kohalikuks ajaks.struct tm
väljade abil (tm_hour
,tm_min
,tm_sec
) saab lugeda üksikuid ajaelemente.
Näidisväljund
Praegune aeg: 14:30:15
Märkus
localtime
tagastab viite staatilisele struktuurile – seda tuleb kasutada ettevaatlikult, nagu selgitame allpool.
4. Näide: kuupäeva ja kellaaja vormindamine
Vormingu muutmine strftime
abil
Kohaliku aja näitamiseks kindlas vormingus kasuta strftime
funktsiooni.
Näiteks kuupäeva ja kellaaja kuvamine kujul “YYYY-MM-DD HH:MM:SS”:
#include <time.h>
#include <stdio.h>
int main() {
time_t t = time(NULL);
struct tm *local = localtime(&t);
char buffer[80];
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local);
printf("Vormindatud aeg: %sn", buffer);
return 0;
}
Näidisväljund
Vormindatud aeg: 2024-11-17 14:30:15
Levinud vorminduskoodid
%Y
: aasta (4 numbrit)%m
: kuu (2 numbrit)%d
: päev (2 numbrit)%H
: tund (24h)%M
: minutid%S
: sekundid

5. Tähelepanekud ja parimad tavad
Lõimede ohutus
localtime
funktsioon ei ole lõimesõbralik. See tähendab, et mitmes lõimes korraga kasutamisel võib tekkida ootamatu käitumine, kuna tagastatud viit osutab staatilisele mälule, mida iga uus väljakutse üle kirjutab.
Lahendus: localtime_r
kasutamine
POSIX-süsteemides on olemas lõimesõbralik localtime_r
, mis kasutab kutsuja poolt ette antud struct tm
muutujat, mitte staatilist mälu.
Näide: localtime_r
kasutamine
#include <time.h>
#include <stdio.h>
int main() {
time_t t = time(NULL);
struct tm local;
if (localtime_r(&t, &local) != NULL) {
printf("Praegune aeg: %02d:%02d:%02dn",
local.tm_hour, local.tm_min, local.tm_sec);
} else {
perror("localtime_r viga");
}
return 0;
}
Windowsis localtime_s
Windowsi keskkonnas on sarnane funktsioon localtime_s
, mis on samuti lõimesõbralik.
Näide: localtime_s
kasutamine
#include <time.h>
#include <stdio.h>
int main() {
time_t t = time(NULL);
struct tm local;
if (localtime_s(&local, &t) == 0) {
printf("Praegune aeg: %02d:%02d:%02dn",
local.tm_hour, local.tm_min, local.tm_sec);
} else {
perror("localtime_s viga");
}
return 0;
}
Mälu haldamine
Kuna localtime
tagastab viite staatilisele mälule, ei pea kasutaja seda käsitsi vabastama. Siiski, iga uus localtime
väljakutse kirjutab selle sisu üle, mistõttu soovitatakse vajadusel andmed eraldi kopeerida.
6. KKK: korduma kippuvad küsimused
K1: Miks võib localtime
tagastada NULL
?
V:
Peamised põhjused:
- Antud
time_t
väärtus on vigane (nt negatiivne). - Süsteemil puudub piisav mälu.
Lahendus:
Kontrolli time_t
väärtust või lisa veahaldus.
if (localtime(&t) == NULL) {
perror("localtime ebaõnnestus");
}
K2: Mis vahe on gmtime
ja localtime
vahel?
V:
localtime
: tagastab kohaliku aja, arvestades ajavööndit.gmtime
: tagastab UTC aja, ajavööndit arvestamata.
K3: Kuidas kasutada localtime
turvaliselt mitmelõimelises keskkonnas?
V:
Kasuta localtime_r
(POSIX) või localtime_s
(Windows), et vältida staatilise mälu konflikte.
7. Seotud funktsioonid
gmtime
gmtime
on sarnane localtime
-le, kuid tagastab UTC aja.
#include <time.h>
#include <stdio.h>
int main() {
time_t t = time(NULL);
struct tm *utc = gmtime(&t);
printf("UTC aeg: %02d:%02d:%02dn",
utc->tm_hour, utc->tm_min, utc->tm_sec);
return 0;
}
mktime
mktime
teisendab struct tm
tagasi time_t
väärtuseks, võimaldades saada UNIXi ajatembli kohalikust ajast.
Näide: mktime
kasutamine
#include <time.h>
#include <stdio.h>
int main() {
struct tm local = {0};
local.tm_year = 2024 - 1900; // aasta alates 1900
local.tm_mon = 10; // kuu (0–11)
local.tm_mday = 17; // päev
time_t t = mktime(&local);
if (t != -1) {
printf("UNIX ajatempel: %ldn", t);
} else {
perror("mktime ebaõnnestus");
}
return 0;
}
8. Kokkuvõte
Selles artiklis käsitlesime C-keele localtime
funktsiooni, selle põhikasutust, näiteid ja tähelepanekuid. Peamised punktid:
- Ülevaade:
localtime
on mugav funktsioon kohaliku aja hankimiseks. - Tähelepanek: See ei ole lõimesõbralik – kasuta
localtime_r
võilocaltime_s
. - Näide: Vormindamine
strftime
abil. - KKK: Levinud probleemid ja lahendused.
Kasutades neid teadmisi, saad localtime
funktsiooni turvaliselt ja tõhusalt kasutada C-keeles aja töötlemiseks. Proovi kombineerida seda ka funktsioonidega gmtime
ja mktime
!