strftime(3) formatiert Datum und Uhrzeit

ÜBERSICHT

#include <time.h>


size_t strftime(char *s, size_t max, const char *format,
const struct tm *tm);

BESCHREIBUNG

Die Funktion strftime() formatiert die zerlegte Zeit tm entsprechend der Formatbeschreibung format und schreibt das Ergebnis in das Feld s der Größe max. Die zerlegte Zeitstruktur tm wird in <time.h> definiert. Siehe auch ctime(3).

Die Formatbeschreibung ist eine null-terminierte Zeichenkette und kann spezielle Zeichenfolgen (sogenannte Konvertierungsanweisungen) enthalten, von denen jede mit einem '%'-Zeichen beginnt und mit einem Zeichen endet, welches die Art der Konvertierung beschreibt (conversion specifier character). Alle weiteren Zeichenfolgen sind normale Zeichenfolgen.

Die Zeichen einfacher Zeichenfolgen (einschließlich des Null-Bytes) werden wortgetreu nach s kopiert. Die Zeichen von Konvertierungsanweisungen werden jedoch wie in der folgenden Liste dargestellt ersetzt. In dieser Liste werden die von der Struktur tm bereitgestellten Felder auch gezeigt.

%a
Der abgekürzte Name des Wochentags abhängig von der momentanen Locale (berechnet aus tm_wday).
%A
Der vollständige Name des Wochentags abhängig von der momentanen Locale (berechnet aus tm_wday).
%b
Der abgekürzte Monatsname abhängig von der momentanen Locale (berechnet aus tm_mon).
%B
Der vollständige Monatsname abhängig von der momentanen Locale (berechnet aus tm_mon).
%c
Das bevorzugte Datums- und Uhrzeit-Repräsentation laut Einstellungen der momentanen Locale.
%C
Das Jahrhundert als zweistellige Zahl (Jahr/100) (berechnet aus tm_year). (SU)
%d
Der Tag im Monat als Dezimalzahl (Bereich 01-31) (berechnet aus tm_mday).
%D
Äquivalent zu %m/%d/%y. (US-amerikanisches Format. In anderen Ländern ist %d/%m/%y eher üblich. In internationalem Kontext ist dieses Format daher mehrdeutig und sollte nicht verwendet werden.) (SU)
%e
Wie %d, der Tag im Monat als Dezimalzahl, aber eine führende Null ist durch ein Leerzeichen ersetzt (berechnet aus tm_mday). (SU)
%E
Modifikator: Alternatives Format benutzen, siehe unten. (SU)
%F
Äquivalent zu %Y-%m-%d (dem ISO-8601-Datumsformat) (C99)
%G
Das wochenbasierte Jahr (siehe ANMERKUNGEN) nach ISO 8601 mit dem Jahrhundert als Dezimalzahl. Das vierstellige Jahr, das zu der ISO-Wochennummer (siehe %V) passt. Es hat dasselbe Format und denselben Wert wie %, wenn aber die ISO-Wochennummer zum vorhergehenden oder nächsten Jahr gehört, wird stattdessen dieses Jahr benutzt (berechnet aus tm_year, tm_yday und tm_wday). (TZ)
%g
Wie %G aber ohne das Jahrhundert, also mit zweistelligem Jahr (00-99) (berechnet aus tm_year, tm_yday und tm_wday). (TZ)
%h
Äquivalent zu %b (SU)
%H
Die Stunde im 24h-Format als Ganzzahl (Bereich 00-23) (berechnet aus tm_hour).
%I
Die Stunde im 12h-Format als Ganzzahl (Bereich 01-12) (berechnet aus tm_hour).
%j
Der Tag im Jahr als Ganzzahl (Bereich 001-366) (berechnet aus tm_yday).
%k
Die Stunde im 24h-Format als Ganzzahl (Bereich 0-23); einzelne Ziffern haben ein vorangestelltes Leerzeichen (siehe auch %H) (berechnet aus tm_hour). (TZ)
%l
Die Stunde im 12h-Format als Ganzzahl (Bereich 1-12); einzelne Ziffern haben ein vorangestelltes Leerzeichen (siehe auch %I) (berechnet aus tm_hour). (TZ)
%m
Der Monat als Ganzzahl (Bereich 01-12) (berechnet aus tm_mon).
%M
Die Minute als Ganzzahl (Bereich 00-59) (berechnet aus tm_min).
%n
Ein Zeilenvorschub. (SU)
%O
Modifikator: Alternatives Format benutzen, siehe unten. (SU)
%p
Entweder »AM« oder »PM«, je nach der übergebenen Uhrzeit, oder die entsprechenden Zeichenketten in der momentanen Locale. Mittag erhält »PM«, Mitternacht »AM« (berechnet aus tm_hour).
%P
Wie %p, aber in Kleinbuchstaben. »am« oder »pm« oder eine entsprechende Zeichenkette in der momentanen Locale (berechnet aus tm_hour). (GNU)
%r
Zeit in AM/PM-Notation; in der POSIX-Locale ist das äquivalent zu %I:%M:%S %p. (SU)
%R
Zeit in 24h-Notation (%H:%M). (SU) Für eine Version mit Sekunden siehe %T weiter unten.
%s
Die Zahl der Sekunden seit der Epoche, also seit 1970-01-01 00:00:00 UTC (berechnet aus mktime(tm)). (TZ)
%S
Die Sekunde als Ganzzahl (Bereich 00-60) (Der Bereich geht bis 60, um gelegentliche Schaltsekunden zu ermöglichen) (berechnet aus tm_sec).
%t
Ein Tabulatorzeichen. (SU)
%T
Zeit in 24h-Notation (%H:%M:%S). (SU)
%u
Der Tag der Woche als Ganzzahl von 1 bis 7, mit Montag als 1. Siehe auch %w (berechnet aus tm_wday). (SU)
%U
Die Wochennummer des aktuellen Jahres als Ganzzahl von 00 bis 53, beginnend mit dem ersten Sonntag als ersten Tag der Woche 01 (berechnet aus tm_yday und tm_wday). Siehe auch %V und %W.
%V
Die Wochennummer nach ISO 8601 des laufenden Jahres als Dezimalzahl von 01 bis 53, wobei Woche 1 die erste Woche ist, die wenigstens 4 Tage im laufenden Jahr hat (berechnet aus tm_year, tm_yday und tm_wday). Siehe auch %U und %W. (SU)
%w
Der Tag der Woche als Dezimalzahl von 0 bis 6, mit Sonntag als 0. Siehe auch %u (berechnet aus tm_wday).
%W
Die Wochennummer des aktuellen Jahres als Ganzzahl von 00 bis 53, beginnend mit dem ersten Montag als ersten Tag der Woche 01 (berechnet aus tm_yday und tm_wday).
%x
Die bevorzugte Datumsrepräsentation ohne die Zeit in der momentanen Locale.
%X
Die bevorzugte Uhrzeitrepräsentation ohne das Datum in der momentanen Locale.
%y
Das Jahr als Ganzzahl ohne das Jahrhundert (Bereich 00-99) (berechnete aus tm_year).
%Y
Das Jahr als Ganzzahl mit dem Jahrhundert (berechnet aus tm_year).
%z
Die numerische Zeitzone in der Form +hhmm oder -hhmm (also die Verschiebung in Minuten relativ zu UTC). (SU)
%Z
Der Zeitzonename oder die Abkürzung.
%+
Datum und Zeit im Format von date(1). (TZ) (Von Glibc2 nicht unterstützt)
%%
Das Zeichen »%«.

Einige Konvertierungsanweisungen können durch vorangestelltes E oder O modifiziert werden, um anzufordern, dass ein alternatives Format benutzt werden soll. Existiert das alternative Format in der momentanen Locale nicht, ist das Verhalten so, als ob es keine Modifikation gibt. (SU) Die Single Unix Specification erwähnt %Ec, %EC, %Ex, %EX, %Ey, %EY, %Od, %Oe, %OH, %OI, %Om, %OM, %OS, %Ou, %OU, %OV, %Ow, %OW, %Oy, wobei der Effekt von O ist, alternative numerische Symbole zu benutzen (etwa römische Zahlen), und der von E, eine von der Locale abhängige alternative Repräsentation zu wählen.

RÜCKGABEWERT

Vorausgesetzt, dass die Zeichenkette einschließlich des abschließenden NULL-Zeichens nicht mehr als max Byte ergibt, liefert strftime() die Anzahl der Byte (ohne das abschließende NULL-Zeichen) zurück, die in das Feld s geschrieben wurden. Falls die Länge der Zeichenkette (einschließlich des abschließenden NULL-Zeichens) größer als max Byte wäre, gibt strftime 0 zurück und der Inhalt des Feldes ist nicht definiert.

Beachten Sie, dass der Rückgabewert 0 nicht notwendigerweise auf einen Fehler hinweist; zum Beispiel ergibt %p in vielen Locales eine leere Zeichenkette. Eine leere format-Zeichenkette wird ebenso zu einer leeren Zeichenkette führen.

UMGEBUNGSVARIABLEN

Die Umgebungsvariablen TZ und LC_CTIME werden benutzt.

ATTRIBUTE

Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.
SchnittstelleAttributWert
strftime() Multithread-FähigkeitMT-Safe env locale

KONFORM ZU

SVr4, C89, C99. Es gibt strikte Teilmengenbeziehungen zwischen den Konvertierungen aus ANSI C (nicht markiert), jenen der Single Unix Specification (markiert als SU), denen aus dem Timezone-Paket von Olson (TZ) und denen aus der Glibc (GNU), außer dass %+ in der Glibc 2 nicht unterstützt wird. Andererseits bietet Glibc 2 einige Erweiterungen. POSIX.1 verweist nur auf ANSI C; POSIX.2 beschreibt unter date(1) einige Erweiterungen, die auch auf strftime zutreffen können. Die %F-Umwandlung findet sich in C99 und POSIX.1-2001.

In SUSv2 ließ %S einen Bereich von 00 bis 61 zu, um die theoretisch mögliche Minute mit zwei Schaltsekunden zu ermöglichen. (Es hat nie so eine Minute gegeben.)

ANMERKUNGEN

ISO-8601-Wochendaten

%G, %g und %V ergeben Werte aus dem wochenbasierten Jahr, die nach der Definition im ISO-8601-Standard berechnet werden. In diesem System beginnen Woche an einem Montag und werden von 01, der ersten Woche, bis zu 52 oder 53 für die letzte Woche gezählt. Woche 1 ist die erste Woche, in der vier oder mehr Tage in das neue Jahr fallen (oder synonym ist: Woche 01 ist die erste Woche des Jahres, die einen Donnerstag enthält, oder die Woche, die den 4. Januar enthält). Wenn drei oder weniger Tage der ersten Kalenderwoche des neuen Jahres in dieses Jahr fallen, dann zählt das wochenbasierte System nach ISO 8601 diese Tage als Teil der Woche 53 des Vorjahres. Zum Beispiel ist der 1. Januar 2010 ein Freitag, was bedeutet, dass nur drei Tage dieser Kalenderwoche in das Jahr 2010 fallen. So betrachtet das wochenbasierte System nach ISO 8601 diese Tage als Teil der Woche 53 (%V) des Jahres 2009 (%G); Woche 01 des ISO-8601-Jahres 2010 beginnt am Montag, dem 4. Januar 2010.

Anmerkungen zur Glibc

Glibc bietet einige Erweiterungen für Konvertierungsanweisungen. (Diese Erweiterungen werden nicht POSIX.1-2001 beschrieben, aber ein paar Systeme stellen ähnliche Möglichkeiten bereit). Zwischen dem '%'-Zeichen und dem Zeichen zur Festlegung der Umwandlung, können ein optionaler Schalter und ein Feld Weite angegeben werden. (Diese gehen den Modifikatoren E oder O voraus, wenn vorhanden.)

Die folgenden Zeichen dürfen als Schalter genutzt werden:

_
(Unterstrich) füllt eine numerische Ergebniszeichenkette mit Leerzeichen auf.
-
(Strich) füllt eine numerische Ergebniszeichenkette nicht mit Leerzeichen auf.
0
Füllt eine numerische Ergebniszeichenkette mit Nullen auf, sogar wenn das Konvertierungszeichen standardmäßig die Auffüllung mit Leerzeichen vorgibt.
^
wandelt alphanumerische Zeichen in der Ergebniszeichenkette in Großbuchstaben um.
#
wechselt in der Ergebniszeichenkette Groß- und Kleinschreibung. (Dieser Schalter arbeitet nur mit bestimmten Konvertierungsanweisungen und davon ergibt nur %Z wirklich Sinn.)

Eine optionale Dezimalzahl zur Angabe folgt dem (möglicherweise fehlenden) Schalter. Falls die natürliche Größe des Feldes kleiner ist als diese Weite, dann wird die Ergebnis-Zeichenkette (links) bis zur angegebenen Weite aufgefüllt.

FEHLER

Wenn die Länge des ausgegebenen Zeichenkette max Bytes übersteigt, wird errno nicht gesetzt. Das macht es unmöglich, diesen Fehler von anderen Fällen zu unterscheiden, wo die format-Zeichenkette regulär eine Ausgabezeichenkette der Länge Null produziert. POSIX.1-2001 gibt keine errno-Einstellungen für strftime() an.

Ein paar fehlerhafte Versionen von gcc(1) beschweren sich über die Verwendung von %c: warning: `%c' yields only last 2 digits of year in some locales. Natürlich werden Programmierer zur Verwendung von %c ermutigt, weil es die bevorzugte Darstellung von Datum und Uhrzeit bewirkt. Man trifft bei der Umgehung dieses gcc(1)-Problemes auf alle möglichen seltsamen Effekte. Ein relativ sauberer Umweg ist das Hinzufügen einer Zwischenfunktion.

size_t
my_strftime(char *s, size_t max, const char *fmt,
            const struct tm *tm)
{
    return strftime(s, max, fmt, tm);
}

Heutzutage stellt gcc(1) die Option -Wno-format-y2k bereit, um die Warnung zu unterdrücken. Damit ist die eben erwähnte Hilfskonstruktion nicht mehr erforderlich.

BEISPIEL

Zu RFC 2822 konformes Datumsformat (mit einer englischen Locale für %a und %b)

"%a, %d %b %Y %T %z"

Zu RFC 822 konformes Datumsformat (mit einer englischen Locale für %a und %b)

"%a, %d %b %y %T %z"

Beispielprogramm

Das folgende Programm kann zum Experimentieren mit strftime() verwendet werden.

Einige Beispiele der von der Glibc-Implementierung von strftime() erstellten Ergebniszeichenkette sind wie folgt:

$ ./a.out '%m'
Ergebniszeichenkette ist "11"
$ ./a.out '%5m'
Ergebniszeichenkette ist "00011"
$ ./a.out '%_5m'
Ergebniszeichenkette ist "   11"

Programmquelltext

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
    char outstr[200];
    time_t t;
    struct tm *tmp;
    t = time(NULL);
    tmp = localtime(&t);
    if (tmp == NULL) {
        perror("localtime");
        exit(EXIT_FAILURE);
    }
    if (strftime(outstr, sizeof(outstr), argv[1], tmp) == 0) {
        fprintf(stderr, "strftime lieferte 0");
        exit(EXIT_FAILURE);
    }
    printf("Ergebniszeichenkette ist \"%s\"\n", outstr);
    exit(EXIT_SUCCESS);
}

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 4.06 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <[email protected]>, Martin Eberhard Schauer <[email protected]> und Mario Blättermann <[email protected]> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 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 <[email protected]>.