strftime(3) | Library Functions Manual | strftime(3) |
BEZEICHNUNG¶
strftime - formatiert Datum und Uhrzeit
BIBLIOTHEK¶
Standard-C-Bibliothek (libc, -lc)
ÜBERSICHT¶
#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);
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 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.
- %a
- Der abgekürzte Name des Wochentags gemäß der momentanen Locale (berechnet aus tm_wday). (Die in der momentanen Locale verwandten speziellen Namen können durch einen Aufruf von nl_langinfo(3) mit dem Argument ABDAY_{1…7} erhalten werden.)
- %A
- Der vollständige Name des Wochentags gemäß der momentanen Locale (berechnet von tm_wday). (Die in der momentanen Locale verwandten speziellen Namen können durch einen Aufruf von nl_langinfo(3) mit dem Argument DAY_{1…7} erhalten werden.)
- %b
- Der abgekürzte Monatsname gemäß der momentanen Locale (berechnet von tm_mon). (Die in der momentanen Locale verwandten speziellen Namen können durch einen Aufruf von nl_langinfo(3) mit dem Argument ABMON_{1…12} erhalten werden.)
- %B
- Der vollständige Monatsname gemäß der momentanen Locale (berechnet von tm_mon). (Die in der momentanen Locale verwandten speziellen Namen können durch einen Aufruf von nl_langinfo(3) mit dem Argument MON_{1…12} erhalten werden.)
- %c
- Die für die momentane Locale bevorzugte Datums- und Uhrzeitdarstellung. (Die in der momentanen Locale verwandten speziellen Namen können durch einen Aufruf von nl_langinfo(3) für den Konvertierungskennzeichner %c mit dem Argument D_T_FMT und für 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 äquivalent.)
- %C
- Das Jahrhundert als zweistellige Zahl (Jahr/100) (der Konvertierungskennzeichner %EC entspricht dem Namen der Ära) (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 (»Ära-basiertes«) Format benutzen, siehe unten. (SU)
- %F
- Equivalent to %Y-%m-%d (the ISO 8601 date format). (C99)
- %G
- The ISO 8601 week-based year (see NOTES) with century as a decimal number. The 4-digit year corresponding to the ISO week number (see %V). This has the same format and value as %Y, except that if the ISO week number belongs to the previous or next year, that year is used instead. (TZ) (Calculated from tm_year, tm_yday, and tm_wday.)
- %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: Alternative numerische Symbole 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). (Die in der momentanen Locale für »AM« und »PM« verwandten speziellen Zeichenketten können 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 äquivalent.)
- %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
- The ISO 8601 week number (see NOTES) of the current year as a decimal number, range 01 to 53, where week 1 is the first week that has at least 4 days in the new year. See also %U and %W. (Calculated from tm_year, tm_yday, and tm_wday.) (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 für die momentane Locale bevorzugte Datumsdarstellung ohne Uhrzeit. (Das in der momentanen Locale verwandte speziellen Format kann durch einen Aufruf von nl_langinfo(3) für den Konvertierungskennzeichner %x mit dem Argument D_FMT und für den Konvertierungskennzeichner %Ex mit dem Argument ERA_D_FMT erhalten werden.) (In der POSIX-Locale ist dies zu %m/%d/%y äquivalent.)
- %X
- Die für die momentane Locale bevorzugte Uhrzeitdarstellung ohne Datum. (Das in der momentanen Locale verwandte speziellen Format kann durch einen Aufruf von nl_langinfo(3) für den Konvertierungskennzeichner %X mit dem Argument T_FMT und für den Konvertierungskennzeichner %EX mit dem Argument ERA_T_FMT erhalten werden.) (In der POSIX-Locale ist dies zu %H:%M:%S äquivalent.)
- %y
- Das Jahr als Dezimalzahl ohne ein Jahrhundert (Bereich 00 bis 99). (Der Konvertierungskennzeichner %Ey entspricht dem Jahr seit dem Anfang der Ära, die durch den Konvertierungskennzeichner %EC bezeichnet ist.) (Berechnet aus tm_year.)
- %Y
- Das Jahr als Ganzzahl mit dem Jahrhundert (der Konvertierungskennzeichner %EY entspricht der vollständigen 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 Abkürzung.
- %+
- Datum und Zeit im Format von date(1). (TZ) (Von Glibc2 nicht unterstützt)
- %%
- Das Zeichen »%«.
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.
RÜCKGABEWERT¶
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.
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.
Schnittstelle | Attribut | Wert |
strftime(), strftime_l() | Multithread-Fähigkeit | MT-Sicher env locale |
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), 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.)
ANMERKUNGEN¶
ISO 8601 week dates¶
%G, %g, and %V yield values calculated from the week-based year defined by the ISO 8601 standard. In this system, weeks start on a Monday, and are numbered from 01, for the first week, up to 52 or 53, for the last week. Week 1 is the first week where four or more days fall within the new year (or, synonymously, week 01 is: the first week of the year that contains a Thursday; or, the week that has 4 January in it). When three or fewer days of the first calendar week of the new year fall within that year, then the ISO 8601 week-based system counts those days as part of week 52 or 53 of the preceding year. For example, 1 January 2010 is a Friday, meaning that just three days of that calendar week fall in 2010. Thus, the ISO 8601 week-based system considers these days to be part of week 53 (%V) of the year 2009 (%G); week 01 of ISO 8601 year 2010 starts on Monday, 4 January 2010. Similarly, the first two days of January 2011 are considered to be part of week 52 of the year 2010.
Anmerkungen zur Glibc¶
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:
- _
- (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 der Konvertierungskennzeichner 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 Konvertierungskennzeichnern und davon ergibt nur %Z wirklich Sinn.)
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.
FEHLER¶
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.
BEISPIELE¶
RFC 2822-compliant date format (with an English locale for %a and %b)
"%a, %d %b %Y %T %z"
RFC 822-compliant date format (with an English locale for %a and %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 <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 zurück");
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)
ÜBERSETZUNG¶
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.
2. Mai 2024 | Linux man-pages (unveröffentlicht) |