C-keele localtime funktsioon: täielik juhend kasutamiseks ja parimad tavad

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

  1. time(NULL) hangib praeguse UNIXi ajatembli.
  2. localtime teisendab selle struct tm tüüpi kohalikuks ajaks.
  3. 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õi localtime_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!

侍エンジニア塾