ctime(3)

BEZEICHNUNG
asctime, ctime, gmtime, localtime, mktime - Datum und Zeit in aufgeschlüsselte Zeit oder ASCII umwandeln

BIBLIOTHEK
Standard-C-Bibliothek (libc, -lc)

ÜBERSICHT
#include <time.h>

char *asctime(const struct tm *tm);
char *asctime_r(const struct tm *restrict tm,
                    char Puffer[restrict 26]);

char *ctime(const time_t *Zeitz);
char *ctime_r(const time_t *restrict Zeitz,
                    char Puffer[restrict 26]);

struct tm *gmtime(const time_t *zeitz);
struct tm *gmtime_r(const time_t *restrict zeitz,
                    struct tm *restrict Ergebnis);

struct tm *localtime(const time_t *zeitz);
struct tm *localtime_r(const time_t *restrict zeitz,
                    struct tm *restrict Ergebnis);

time_t mktime(struct tm *tm);

    Mit Glibc erforderliche Feature-Test-Makros (siehe feature_test_macros(7)):

asctime_r(), ctime_r(), gmtime_r(), localtime_r():
_POSIX_C_SOURCE
    || /* Glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

BESCHREIBUNG
Die Funktionen ctime(), gmtime() und localtime() benötigen ein Argument des Datentyps time_t, welches die Kalenderzeit darstellt. Wenn sie als absoluter Zeitwert interpretiert wird, stellt sie die Unixzeit dar, die Sekunden, die seit dem 1. Januar 1970, 00:00.00 Uhr koordinierter Weltzeit (UTC) verstrichen sind.

Die Funktionen asctime() und mktime() benötigen jeweils ein Argument das eine aufgeschlüsselte Zeitangabe darstellt, die in Jahr, Monat, Tag usw. aufgeteilt ist.

Aufgeschlüsselte Zeit wird in der Struktur tm gespeichert, die in tm(3type) beschrieben ist.

Der Aufruf ctime(t) entspricht asctime(localtime(t)). Er konvertiert die Kalenderzeit t in eine durch Null beendete Zeichenkette der Form

    "Wed Jun 30 21:49:08 1993\n"

Die Abkürzungen für die Wochentage sind »Sun«, »Mon«, »Tue«, »Wed«, »Thu«, »Fri« und »Sat«. Die Abkürzungen für die Monate sind »Jan«, »Feb«, »Mar«, »Apr«, »May«, »Jun«, »Jul«, »Aug«, »Sep«, »Oct«, »Nov« und »Dec«. Der Rückgabewert zeigt auf eine statisch reservierte Zeichenkette, die durch nachfolgende Aufrufe von Datums- und Zeitfunktionen überschrieben werden darf. Die Funktion setzt auch die externen Variablen tzname, timezone und daylight, als ob tzset(3) aufgerufen worden wäre. Die ablaufinvariante Version ctime_r() tut dasselbe, speichert aber die Zeichenkette in einem vom Benutzer gelieferten Zeichenkettenpuffer, der Platz für mindestens 26 Byte haben sollte. tzname, timezone und daylight müssen nicht gesetzt sein.

Die Funktion gmtime() wandelt die Kalenderzeit zeitz in eine aufgeschlüsselte Entsprechung der Zeit um, die in koordinierter Weltzeit (UTC) ausgedrückt wird. Sie kann NULL zurückgeben, wenn das Jahr nicht in eine Ganzzahl passt. Der Rückgabewert zeigt auf eine statisch reservierte Struktur, die von nachfolgenden Aufrufen irgendwelcher Datums- und Zeitfunktionen überschrieben werden kann. Die Funktion gmtime_r() tut das gleiche, speichert aber die Daten in einer vom Benutzer gelieferten Struktur.

Die Funktion localtime() wandelt die Kalenderzeit zeitz in eine aufgeschlüsselte Entsprechung der Zeit um, ausgedrückt relativ zu der vom Benutzer angegebenen Zeitzone. Die Funktion setzt auch die externen Variablen tzname, timezone und daylight, als ob sie tzset(3) aufriefe. Der Rückgabewert zeigt auf eine statisch reservierte Struktur, die von nachfolgenden Aufrufen irgendwelcher Datums- und Zeitfunktionen überschrieben werden kann. Die Funktion localtime_r() tut das gleiche, speichert aber die Daten in einer vom Benutzer gelieferten Struktur. tzname, timezone und daylight müssen nicht gesetzt sein.

Die Funktion asctime() wandelt den aufgeschlüsselten Zeitwert tm in eine durch Null beendete Zeichenkette mit dem gleichen Format wie ctime(). Der Rückgabewert zeigt auf eine statisch reservierte Zeichenkette, die von nachfolgenden Aufrufen irgendwelcher Datums- und Zeitfunktionen überschrieben werden kann. Die Funktion asctime_r() tut das gleiche, speichert aber die Zeichenkette in einem vom Benutzer gelieferten Zeichenkettenpuffer, der Platz für mindestens 26 Byte haben sollte.

Die Funktion mktime() wandelt die aufgeschlüsselten Zeitstruktur, die als lokale Zeit ausgedrückt wird, in eine Entsprechung der Kalenderzeit. Die Funktion ignoriert die Werte, die der Aufrufende in den Feldern tm_wday und tm_yday mitgegeben hat, egal ob in der Zeit der mitgegebenen Struktur tm Sommerzeit ist oder nicht: Ein positiver Wert bedeutet, dass Sommerzeit ist, Null bedeutet, dass keine Sommerzeit ist und ein negativer Wert bedeutet, dass mktime() (mit Zeitzoneninformationen und Systemdatenbanken) versuchen sollte zu bestimmen, ob zur angegebenen Zeit Sommerzeit ist oder nicht. Siehe timegm(3) für ein UTC-Äquivalent für diese Funktion.

Die Funktion mktime() ändert die Felder der Struktur tm wie folgt: tm_wday und tm_yday werden auf die Werte gesetzt, die vom Inhalt anderer Felder bestimmt werden; falls Elemente der Stuktur außerhalb ihres erlaubten Intervalls liegen, werden sie normalisiert (so dass zum Beispiel der 40. Oktober auf 9. November geändert wird); tm_isdst wird (unabhängig vom anfänglichen Wert) auf einen positiven Wert beziehungsweise 0 gesetzt, um anzuzeigen, ob zur angegebenen Zeit Sommerzeit ist oder nicht. Die Funktion setzt auch die externen Variablen tzname, timezone und daylight, als ob sie tzset(3) aufriefe.

Falls die angegebene aufgeschlüsselte Zeit nicht als Kalenderzeit (Unixzeit in Sekunden) dargestellt werden kann, gibt mktime() (time_t) -1 zurück und verändert die Elemente der aufgeschlüsselten Zeitstruktur nicht.

RÜCKGABEWERT
Im Erfolgsfall liefern gmtime() und localtime() einen Zeiger auf ein struct tm zurück.

Im Erfolgsfall liefern gmtime_r() und localtime_r() die Adresse der Struktur zurück, auf die result zeigt.

Im Erfolgsfall liefern asctime() und ctime() einen Zeiger auf eine Zeichenkette zurück.

Im Erfolgsfall liefern asctime_r() und ctime_r() einen Zeiger zurück, auf den buf zeigt.

Im Erfolgsfall liefert mktime() die Kalenderzeit (Sekunden seit der Epoch) zurück, ausgedrückt als Wert des Typs time_t.

Im Fehlerfall liefert mktime() den Wert (time_t) -1 zurück und belässt das Mitglied tm->tm_wday unverändert. Die verbliebenen Funktionen liefern NULL im Fehlerfall zurück. Im Fehlerfall wird errno gesetzt, um den Fehler anzuzeigen.

FEHLER

EOVERFLOW
    Das Ergebnis kann nicht dargestellt werden.

ATTRIBUTE
Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.
Schnittstelle | Attribut | Wert
asctime() | Multithread-Fähigkeit | MT-Unsicher race:asctime locale
asctime_r() | Multithread-Fähigkeit | MT-Sicher locale
ctime() | Multithread-Fähigkeit | MT-Unsicher race:tmbuf race:asctime env locale
ctime_r(), gmtime_r(), localtime_r(), mktime() | Multithread-Fähigkeit | MT-Sicher env locale
gmtime(), localtime() | Multithread-Fähigkeit | MT-Unsicher race:tmbuf env locale

VERSIONEN
POSIX spezifiziert die Parameter von ctime_r() nicht als restrict; dies ist Glibc-spezifisch.

In vielen Implementierungen, einschließlich Glibc, wird a 0 in tm_mday als letzter Tag des vorhergehenden Monats interpretiert.

Gemäß POSIX.1 wird localtime() benötigt, um sich so zu verhalten, als sei tzset(3) aufgerufen worden, während localtime_r() nicht diese Anforderung stellt. Für portierbaren Code sollte tzset(3) vor localtime_r() aufgerufen werden.

STANDARDS

asctime()
ctime()
gmtime()
localtime()
mktime()
    C23, POSIX.1-2024.

gmtime_r()
localtime_r()
    POSIX.1-2024.

asctime_r()
ctime_r()
    Keine.

GESCHICHTE

gmtime()
localtime()
mktime()
    C89, POSIX.1-1988.

asctime()
ctime()
    C89, POSIX.1-1988. Wurde in C23 und POSIX.1-2008 als veraltet markiert (und strftime(3) empfohlen).

gmtime_r()
localtime_r()
    POSIX.1-1996.

asctime_r()
ctime_r()
    POSIX.1-1996. Wurde in POSIX.1-2008 als veraltet markiert. Entfernt in POSIX.1-2024 (und Empfehlung für strftime(3)).

WARNUNGEN

  Multithread-Fähigkeit
Die vier Funktionen asctime(), ctime(), gmtime() und localtime() geben einen Zeiger auf statische Daten zurück und sind daher nicht multithread-fähig. Multithread-fähige Versionen asctime_r(), ctime_r(), gmtime_r() und localtime_r werden durch SUSv2 spezifiziert.

POSIX.1 sagt: »Die Funktionen asctime(), ctime(), gmtime() und localtime() müssen Rückgabewerte in einem von zwei statischen Objekten liefern: einer aufgeschlüsselten Zeit und einem Feld des Typs char. Das Ausführen irgendeiner der Funktionen, die einen Zeiger auf einen dieser Objekttypen zurückliefert, können die Informationen in jedem Objekt des gleichen Typs überschreiben, auf den durch den zurückgelieferten Werte von einem vorherigen Aufruf von einem von ihnen gezeigt wird.« Dies kann in der Glibc-Implementierung vorkommen.

  mktime()
(time_t) -1 kann eine gültige Zeit darstellen (eine Sekunde vor dem Epoch). Um zu bestimmen, ob mktime() fehlgeschlagen ist, müssen Sie das Feld tm->tm_wday verwenden. Siehe dazu des Beispielprogramm in BEISPIELE.

Der Umgang mit nichtnegativen tm_isdst in mktime() ist schlecht spezifiziert und die Übergabe eines Wertes, der für die festgelegte Zeit nicht korrekt ist, führt zu nicht spezifizierten Ergebnissen. Da mktime() eine der wenigen Funktionen ist, die weiß, wann Sommerzeit gilt, kann die Übergabe eines korrekten Wertes schwierig sein. Eine Hilfskonstruktion besteht darin, mktime() zweimal aufzurufen, einmal mit tm_isdst auf Null gesetzt und einmal mit tm_isdst auf einen positiven Wert gesetzt und dann dem Verwerfen des Wertes des Aufrufs, der diesen änderte. Falls kein Aufruf tm_isdst ändert, dann passiert die angegebene Zeit wahrscheinlich während einer Rückfallperiode, zu der Sommerzeit beginnt oder endet und beide Ergebnisse sind gültig, stellen aber verschiedene Zeiten dar. Falls beide Aufrufe sie ändern, könnte das einen vorwärts fallenden Übergang darstellen oder einen anderen Grund, warum die angegebene Zeit nicht existiert.

DIe Spezifizierung von Zeitzonen und Sommerzeitregeln unterliegt regionalen Regierungen, ändert sich oft und könnte solche Sprünge enthalten, die mktime als Ergebnis nicht mehr dokumentieren kann. Beispielsweise könnte eine Änderung in der Zeitzonendefinition dazu führen, dass eine Uhrzeit wiederholt oder übersprungen wird, ohne dass eine entsprechende Sommerzeitregelung vorliegt.

BEISPIELE
Das nachfolgende Programm definiert einen Wrapper, der die Erkennung von ungültigen und mehrdeutigen Zeiten mittels EINVAL bzw. ENOTUNIQ erlaubt.

Die nachfolgende Shell-Sitzung zeigt Beispielläufe des Programms:

    $ TZ=UTC ./a.out 1969 12 31 23 59 59 0;
    -1
    $
    $ export TZ=Europe/Madrid;
    $
    $ ./a.out 2147483647 2147483647 00 00 00 00 -1;
    a.out: mktime: Value too large for defined data type
    $
    $ ./a.out 2024 08 23 00 17 53 -1;
    1724365073
    $ ./a.out 2024 08 23 00 17 53 0;
    a.out: my_mktime: Invalid argument
    1724368673
    $ ./a.out 2024 08 23 00 17 53 1;
    1724365073
    $
    $ ./a.out 2024 02 23 00 17 53 -1;
    1708643873
    $ ./a.out 2024 02 23 00 17 53 0;
    1708643873
    $ ./a.out 2024 02 23 00 17 53 1;
    a.out: my_mktime: Invalid argument
    1708640273
    $
    $ ./a.out 2023 03 26 02 17 53 -1;
    a.out: my_mktime: Invalid argument
    1679793473
    $
    $ ./a.out 2023 10 29 02 17 53 -1;
    a.out: my_mktime: Name not unique on network
    1698542273
    $ ./a.out 2023 10 29 02 17 53 0;
    1698542273
    $ ./a.out 2023 10 29 02 17 53 1;
    1698538673
    $
    $ ./a.out 2023 02 29 12 00 00 -1;
    a.out: my_mktime: Invalid argument
    1677668400

  Programmquelltext: mktime.c
    #include <err.h>
    #include <errno.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>

    #define is_signed(T)  ((T) -1 < 1)

    static time_t my_mktime(struct tm *tp);

    int
    main(int argc, char *argv[])
    {
        char       **p;
        time_t     t;
        struct tm  tm;

        if (argc != 8) {
            fprintf(stderr, "Aufruf: %s yyyy mm dd HH MM SS isdst\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        p = &argv[1];
        tm.tm_year  = atoi(*p++) - 1900;
        tm.tm_mon   = atoi(*p++) - 1;
        tm.tm_mday  = atoi(*p++);
        tm.tm_hour  = atoi(*p++);
        tm.tm_min   = atoi(*p++);
        tm.tm_sec   = atoi(*p++);
        tm.tm_isdst = atoi(*p++);

        errno = 0;
        tm.tm_wday = -1;
        t = my_mktime(&tm);
        if (tm.tm_wday == -1)
            err(EXIT_FAILURE, "mktime");
        if (errno == EINVAL || errno == ENOTUNIQ)
            warn("my_mktime");

        if (is_signed(time_t))
            printf("%jd\n", (intmax_t) t);
        else
            printf("%ju\n", (uintmax_t) t);

        exit(EXIT_SUCCESS);
    }

    static time_t
    my_mktime(struct tm *tp)
    {
        int            e, isdst;
        time_t         t;
        struct tm      tm;
        unsigned char  wday[sizeof(tp->tm_wday)];

        e = errno;

        tm = *tp;
        isdst = tp->tm_isdst;

        memcpy(wday, &tp->tm_wday, sizeof(wday));
        tp->tm_wday = -1;
        t = mktime(tp);
        if (tp->tm_wday == -1) {
            memcpy(&tp->tm_wday, wday, sizeof(wday));
            return -1;
        }

        if (isdst == -1)
            tm.tm_isdst = tp->tm_isdst;

        if (   tm.tm_sec   != tp->tm_sec
            || tm.tm_min   != tp->tm_min
            || tm.tm_hour  != tp->tm_hour
            || tm.tm_mday  != tp->tm_mday
            || tm.tm_mon   != tp->tm_mon
            || tm.tm_year  != tp->tm_year
            || tm.tm_isdst != tp->tm_isdst)
        {
            errno = EINVAL;
            return t;
        }

        if (isdst != -1)
            goto out;

        tm = *tp;
        tm.tm_isdst = !tm.tm_isdst;

        tm.tm_wday = -1;
        mktime(&tm);
        if (tm.tm_wday == -1)
            goto out;

        if (tm.tm_isdst != tp->tm_isdst) {
            errno = ENOTUNIQ;
            return t;
        }
    out:
        errno = e;
        return t;
    }

SIEHE AUCH
date(1), gettimeofday(2), time(2), utime(2), clock(3), difftime(3), strftime(3), strptime(3), timegm(3), tzset(3), time(7)

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother <krd@gulu.net>, Chris Leick <c.leick@vollbio.de>, Mario Blättermann <mario.blaettermann@gmail.com> und Helge Kreutzmann <debian@helgefjell.de> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer: debian-l10n-german@lists.debian.org.