strftime(3) | Library Functions Manual | strftime(3) |
strftime - formatiert Datum und Uhrzeit
Standard-C-Bibliothek (libc, -lc)
#include <time.h>
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);
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 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 (einschließlich 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.
Einige Konvertierungskennzeichner 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. Die Regeln, mit denen der Modifikator E die Datumsdarstellung steuert, können durch Bereitstellung des Arguments ERA für ein nl_langinfo(3) erhalten werden. Ein Beispiel für eine solche alternative Form ist das japanische Ära-Schema in der Glibc-Locale ja_JP.
strftime_l() ist das Äquivalent zu strftime(), außer dass es die festgelegte locale anstatt der aktuellen Locale verwendet. Das Verhalten ist nicht definiert, falls locale ungültig oder LC_GLOBAL_LOCALE ist.
Vorausgesetzt, dass die Zeichenkette einschließlich des abschließenden Nullbytes nicht mehr als max Byte ergibt, liefert strftime() die Anzahl der Byte (ohne das abschließende Nullbyte) zurück, die in das Feld s geschrieben wurden. Falls die Länge der Zeichenkette (einschließlich des abschließenden Nullbytes) 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.
Die Umgebungsvariablen TZ und LC_CTIME werden benutzt.
Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.
Schnittstelle | Attribut | Wert |
strftime(), strftime_l() | Multithread-Fähigkeit | MT-Safe env locale |
strftime(): SVr4, C99.
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), 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ß der Kennzeichner %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.)
%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 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 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.
Glibc bietet einige Erweiterungen für Konvertierungsanweisungen. (Diese Erweiterungen werden nicht in POSIX.1-2001 beschrieben, aber ein paar Systeme stellen ähnliche Möglichkeiten bereit). Zwischen dem Zeichen »%« und dem Umwandlungskennzeichnungszeichen 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:
Ein optionaler dezimaler Breitenkennzeichner kann dem (möglicherweise fehlenden) Schalter folgen. Falls die natürliche Größe des Feldes kleiner als diese Weite ist, dann wird die Ergebniszeichenkette (links) bis zur angegebenen Weite aufgefüllt.
Wenn die Länge der 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.
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"
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"
#include <stdio.h> #include <stdlib.h> #include <time.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); }
date(1), time(2), ctime(3), nl_langinfo(3), setlocale(3), sprintf(3), strptime(3)
Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de>, Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> und Mario Blättermann <mario.blaettermann@gmail.com> 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 die Mailingliste der Übersetzer.
5. Februar 2023 | Linux man-pages 6.03 |