strftime(3) Library Functions Manual strftime(3) BEZEICHNUNG strftime - formatiert Datum und Uhrzeit BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include size_t strftime(char s[restrict .max], size_t max, const char *restrict format, const struct tm *restrict tm); size_t strftime_l(char s[restrict .max], size_t max, const char *restrict format, const struct tm *restrict tm, locale_t locale); BESCHREIBUNG Die Funktion strftime() formatiert die zerlegte Zeit tm entsprechend der Formatbeschreibung format und schreibt das Ergebnis in das Feld s der Grosse max. Die zerlegte Zeitstruktur tm wird in definiert. Siehe auch ctime(3). Die Formatbeschreibung ist eine null-terminierte Zeichenkette und kann spezielle Zeichenfolgen (sogenannte Konvertierungskennzeichner) enthalten, von denen jede mit einem Zeichen >>%<< beginnt und mit einem anderen Zeichen endet, welches die Art der Konvertierung beschreibt (Umwandlungskennzeichnungszeichen). Alle weiteren Zeichenfolgen sind normale Zeichenfolgen. Die Zeichen einfacher Zeichenfolgen (einschliesslich des Nullbytes) 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 abgekurzte Name des Wochentags gemass der momentanen Locale (berechnet aus tm_wday). (Die in der momentanen Locale verwandten speziellen Namen konnen durch einen Aufruf von nl_langinfo(3) mit dem Argument ABDAY_{17} erhalten werden.) %A Der vollstandige Name des Wochentags gemass der momentanen Locale (berechnet von tm_wday). (Die in der momentanen Locale verwandten speziellen Namen konnen durch einen Aufruf von nl_langinfo(3) mit dem Argument DAY_{17} erhalten werden.) %b Der abgekurzte Monatsname gemass der momentanen Locale (berechnet von tm_mon). (Die in der momentanen Locale verwandten speziellen Namen konnen durch einen Aufruf von nl_langinfo(3) mit dem Argument ABMON_{112} erhalten werden.) %B Der vollstandige Monatsname gemass der momentanen Locale (berechnet von tm_mon). (Die in der momentanen Locale verwandten speziellen Namen konnen durch einen Aufruf von nl_langinfo(3) mit dem Argument MON_{112} erhalten werden.) %c Die fur die momentane Locale bevorzugte Datums- und Uhrzeitdarstellung. (Die in der momentanen Locale verwandten speziellen Namen konnen durch einen Aufruf von nl_langinfo(3) fur den Konvertierungskennzeichner %c mit dem Argument D_T_FMT und fur den Konvertierungskennzeichner %Ec mit dem Argument ERA_D_T_FMT erhalten werden.) (In der POSIX-Locale ist dies zu %a %b %e %H:%M:%S %Y aquivalent.) %C Das Jahrhundert als zweistellige Zahl (Jahr/100) (der Konvertierungskennzeichner %EC entspricht dem Namen der Ara) (berechnet aus tm_year). (SU) %d Der Tag im Monat als Dezimalzahl (Bereich 01-31) (berechnet aus tm_mday). %D Aquivalent zu %m/%d/%y. (US-amerikanisches Format. In anderen Landern ist %d/%m/%y eher ublich. 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 fuhrende Null ist durch ein Leerzeichen ersetzt (berechnet aus tm_mday). (SU) %E Modifikator: Alternatives (>>Ara-basiertes<<) Format benutzen, siehe unten. (SU) %F Aquivalent 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 nachsten Jahr gehort, 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 (0099) (berechnet aus tm_year, tm_yday und tm_wday). (TZ) %h Aquivalent 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: Alternative numerische Symbole benutzen, siehe unten. (SU) %p Entweder >>AM<< oder >>PM<<, je nach der ubergebenen Uhrzeit, oder die entsprechenden Zeichenketten in der momentanen Locale. Mittag erhalt >>PM<<, Mitternacht >>AM<< (berechnet aus tm_hour). (Die in der momentanen Locale fur >>AM<< und >>PM<< verwandten speziellen Zeichenketten konnen durch einen Aufruf von nl_langinfo(3) mit dem Argument AM_STR bzw. PM_STR erhalten werden.) %P Wie %p, aber in Kleinbuchstaben. >>am<< oder >>pm<< oder eine entsprechende Zeichenkette in der momentanen Locale (berechnet aus tm_hour). (GNU) %r Die Zeit in der a.m.- oder p.m-Darstellung. (SU) (Das in der momentanen Locale verwandte spezielle Format kann durch einen Aufruf von nl_langinfo(3) mit dem Argument T_FMT_AMPM erhalten werden.) (In der POSIX-Locale ist dies zu %I:%M:%S %p aquivalent.) %R Zeit in 24h-Notation (%H:%M). (SU) Fur 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 ermoglichen) (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 fur die momentane Locale bevorzugte Datumsdarstellung ohne Uhrzeit. (Das in der momentanen Locale verwandte speziellen Format kann durch einen Aufruf von nl_langinfo(3) fur den Konvertierungskennzeichner %x mit dem Argument D_FMT und fur den Konvertierungskennzeichner %Ex mit dem Argument ERA_D_FMT erhalten werden.) (In der POSIX-Locale ist dies zu %m/%d/%y aquivalent.) %X Die fur die momentane Locale bevorzugte Uhrzeitdarstellung ohne Datum. (Das in der momentanen Locale verwandte speziellen Format kann durch einen Aufruf von nl_langinfo(3) fur den Konvertierungskennzeichner %X mit dem Argument T_FMT und fur den Konvertierungskennzeichner %EX mit dem Argument ERA_T_FMT erhalten werden.) (In der POSIX-Locale ist dies zu %H:%M:%S aquivalent.) %y Das Jahr als Dezimalzahl ohne ein Jahrhundert (Bereich 00 bis 99). (Der Konvertierungskennzeichner %Ey entspricht dem Jahr seit dem Anfang der Ara, die durch den Konvertierungskennzeichner %EC bezeichnet ist.) (Berechnet aus tm_year.) %Y Das Jahr als Ganzzahl mit dem Jahrhundert (der Konvertierungskennzeichner %EY entspricht der vollstandigen alternativen Jahresdarstellung) (berechnet aus tm_year). %z Die numerische Zeitzone in der Form +hhmm oder -hhmm (also die Verschiebung in Stunden und Minuten relativ zu UTC). (SU) %Z Der Zeitzonenname oder die Abkurzung. %+ Datum und Zeit im Format von date(1). (TZ) (Von Glibc2 nicht unterstutzt) %% Das Zeichen >>%<<. Einige Konvertierungskennzeichner konnen 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 erwahnt %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 romische Zahlen), und der von E, eine von der Locale abhangige alternative Reprasentation zu wahlen. Die Regeln, mit denen der Modifikator E die Datumsdarstellung steuert, konnen durch Bereitstellung des Arguments ERA fur ein nl_langinfo(3) erhalten werden. Ein Beispiel fur eine solche alternative Form ist das japanische Ara-Schema in der Glibc-Locale ja_JP. strftime_l() ist das Aquivalent zu strftime(), ausser dass es die festgelegte locale anstatt der aktuellen Locale verwendet. Das Verhalten ist nicht definiert, falls locale ungultig oder LC_GLOBAL_LOCALE ist. RUCKGABEWERT Vorausgesetzt, dass die Zeichenkette einschliesslich des abschliessenden Nullbytes nicht mehr als max Byte ergibt, liefert strftime() die Anzahl der Byte (ohne das abschliessende Nullbyte) zuruck, die in das Feld s geschrieben wurden. Falls die Lange der Zeichenkette (einschliesslich des abschliessenden Nullbytes) grosser als max byte ware, gibt strftime 0 zuruck und der Inhalt des Feldes ist nicht definiert. Beachten Sie, dass der Ruckgabewert 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 fuhren. UMGEBUNGSVARIABLEN Die Umgebungsvariablen TZ und LC_CTIME werden benutzt. ATTRIBUTE Siehe attributes(7) fur eine Erlauterung der in diesem Abschnitt verwandten Ausdrucke. +---------------------+-------------------------+----------------------+ |Schnittstelle | Attribut | Wert | +---------------------+-------------------------+----------------------+ |strftime(), | Multithread-Fahigkeit | MT-Sicher env locale | |strftime_l() | | | +---------------------+-------------------------+----------------------+ STANDARDS strftime() C11, POSIX.1-2008. strftime_l() POSIX.1-2008. GESCHICHTE strftime() SVr4, C89. strftime_l() POSIX.1-2008. 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), ausser dass %+ in der Glibc 2 nicht unterstutzt 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 konnen. Die %F-Umwandlung findet sich in C99 und POSIX.1-2001. In SUSv2 liess der Kennzeichner %S einen Bereich von 00 bis 61 zu, um die theoretisch mogliche Minute mit zwei Schaltsekunden zu ermoglichen. (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 Wochen an einem Montag und werden von 01, der ersten Woche, bis zu 52 oder 53 fur die letzte Woche gezahlt. 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 enthalt, oder die Woche, die den 4. Januar enthalt). Wenn drei oder weniger Tage der ersten Kalenderwoche des neuen Jahres in dieses Jahr fallen, dann zahlt das wochenbasierte System nach ISO 8601 diese Tage als Teil der Woche 52 oder 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. Entsprechend werden die ersten zwei Tage des Januars 2011 als Teil der Woche 52 des Jahres 2010 betrachtet. Anmerkungen zur Glibc Glibc bietet einige Erweiterungen fur Konvertierungsanweisungen. (Diese Erweiterungen werden nicht in POSIX.1-2001 beschrieben, aber ein paar Systeme stellen ahnliche Moglichkeiten bereit). Zwischen dem Zeichen >>%<< und dem Umwandlungskennzeichnungszeichen konnen ein optionaler Schalter und ein Feld Weite angegeben werden. (Diese gehen den Modifikatoren E oder O voraus, wenn vorhanden.) Die folgenden Zeichen durfen als Schalter genutzt werden: _ (Unterstrich) fullt eine numerische Ergebniszeichenkette mit Leerzeichen auf. - (Strich) fullt eine numerische Ergebniszeichenkette nicht mit Leerzeichen auf. 0 Fullt eine numerische Ergebniszeichenkette mit Nullen auf, sogar wenn der Konvertierungskennzeichner standardmassig die Auffullung mit Leerzeichen vorgibt. ^ wandelt alphanumerische Zeichen in der Ergebniszeichenkette in Grossbuchstaben um. # wechselt in der Ergebniszeichenkette Gross- und Kleinschreibung. (Dieser Schalter arbeitet nur mit bestimmten Konvertierungskennzeichnern und davon ergibt nur %Z wirklich Sinn.) Ein optionaler dezimaler Breitenkennzeichner kann dem (moglicherweise fehlenden) Schalter folgen. Falls die naturliche Grosse des Feldes kleiner als diese Weite ist, dann wird die Ergebniszeichenkette (links) bis zur angegebenen Weite aufgefullt. FEHLER Wenn die Lange der ausgegebenen Zeichenkette max Bytes ubersteigt, wird errno nicht gesetzt. Das macht es unmoglich, diesen Fehler von anderen Fallen zu unterscheiden, wo die format-Zeichenkette regular eine Ausgabezeichenkette der Lange Null produziert. POSIX.1-2001 gibt keine errno-Einstellungen fur strftime() an. Ein paar fehlerhafte Versionen von gcc(1) beschweren sich uber die Verwendung von %c: warning: `%c' yields only last 2 digits of year in some locales. Naturlich 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 moglichen seltsamen Effekte. Ein relativ sauberer Umweg ist das Hinzufugen 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 unterdrucken. Damit ist die eben erwahnte Hilfskonstruktion nicht mehr erforderlich. BEISPIELE Zu RFC 2822 konformes Datumsformat (mit einer englischen Locale fur %a und %b) "%a, %d %b %Y %T %z" Zu RFC 822 konformes Datumsformat (mit einer englischen Locale fur %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 #include #include 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 zuruck"); exit(EXIT_FAILURE); } printf("Ergebniszeichenkette ist \"%s\"\n", outstr); exit(EXIT_SUCCESS); } SIEHE AUCH date(1), time(2), ctime(3), nl_langinfo(3), setlocale(3), sprintf(3), strptime(3) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Helge Kreutzmann , Martin Eberhard Schauer und Mario Blattermann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.12 23. Juli 2024 strftime(3)