strftime(3) | Library Functions Manual | strftime(3) |
strftime - Formater la date et l'heure
Bibliothèque C standard (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);
La fonction strftime() formate les divers champs de la structure tm en fonction de la chaîne de spécification format, puis place le résultat dans la chaîne s de taille max. Le détail de la structure tm est donné dans <time.h>. Consultez également ctime(3).
La spécification de format est une chaîne terminée par l’octet NULL, qui peut contenir des séquences de caractères spéciales appelées spécifications de conversion, chacune commençant par un caractère « % » et se terminant par un autre caractère, appelé caractère spécificateur de conversion. Toutes les autres séquences de caractères sont des séquences de caractères ordinaires.
Les caractères des séquences de caractères ordinaires (y compris l'octet NULL) sont copiés tels quels depuis format dans s. Cependant, les caractères indicateurs de conversion sont remplacés comme montré dans la liste ci-dessous. Dans cette liste, le(s) champ(s) de la structure tm employés sont également détaillés.
Certaines spécifications de conversion peuvent être modifiées en faisant précéder le caractère spécificateur de conversion par le modificateur E ou O pour indiquer un format de rechange. Si le format de rechange n'existe pas pour la localisation en cours, le comportement ne sera pas modifié. Les spécifications Single UNIX (SU) mentionnent %Ec, %EC, %Ex, %EX, %Ey, %EY, %Od, %Oe, %OH, %OI, %Om, %OM, %OS, %Ou, %OU, %OV, %Ow, %OW, %Oy, où l'action du modificateur O est d'utiliser un autre format numérique (par exemple des chiffres romains), et l'action de E est d'utiliser une représentation dépendante de la localisation. Les règles encadrant la représentation des dates avec l'indicateur E peuvent être obtenues par un appel à nl_langinfo(3) avec ERA pour argument. Un exemple d'une telle forme alternative est le schéma de calendrier d'ère japonais dans la locale ja_JP de la glibc.
LA fonction strftime_l() est équivalente à strftime(), à part qu'elle utilise la localisation locale spécifiée à la place de la locale en cours. Le comportement est indéfini si locale n'est pas valable ou est LC_GLOBAL_LOCALE.
Si la taille de la chaîne de résultat ne dépasse pas max octets (octet NULL compris), la fonction strftime() renvoie le nombre d'octets écrits dans le tableau s, sans compter l'octet NULL final. Si la longueur de la chaîne dépasse max octets (octet NULL compris), strftime() renvoie 0 et le contenu de la chaîne est indéfini.
Remarquez qu'une valeur de retour nulle n'indique pas toujours une erreur. Dans de nombreuses localisations, par exemple, %p renvoie une chaîne vide. Une chaîne format vide renvoie aussi une chaîne vide.
Les variables d'environnement TZ et LC_TIME sont utilisées.
Pour une explication des termes utilisés dans cette section, consulter attributes(7).
Interface | Attribut | Valeur |
strftime(), strftime_l() | Sécurité des threads | MT-Safe env locale |
strftime() : SVr4, C99.
strftime_l() : POSIX.1-2008.
Il y a une inclusion stricte entre les jeux de conversions fournies par ANSI C (sans marque), celles indiquées par les Spécifications Single UNIX (marquées SU), celles fournies par le paquet timezone d'Olson (marquées TZ), et celles de la glibc (marquées GNU), sauf pour %+ qui n'est pas pris en charge par la glibc2. D'un autre côté glibc2 offre plusieurs extensions. POSIX.1 ne traite que les conversions ANSI C. POSIX.2 décrit à propos de date(1) plusieurs extensions applicables également à strftime(). La conversion %F est dans C99 et POSIX.1-2001.
Dans SUSv2, le %S spécifié permettait un intervalle de 00 à 61, pour autoriser la possibilité théorique d'une minute incluant une double seconde de rattrapage (il n'y a jamais eu de telle minute).
%G, %g et %V produisent des valeurs calculées sur la base des semaines de l'année définies par la norme ISO 8601. Dans ce système, les semaines démarrent le lundi et sont numérotées de 01, pour la première semaine, jusqu'à 52 ou 53, pour la dernière semaine. La semaine 1 est la première semaine pour laquelle au moins quatre jours sont dans l'année (ce qui revient au même que de la définir comme la semaine du premier jeudi de l'année ou la semaine du 4 janvier). Quand trois jours, ou moins, se trouvent dans la première semaine calendaire de la nouvelle année se trouvent dans cette année, alors le système de numérotation des semaines de l'ISO 8601 place ces jours dans la semaine 52 ou 53 de l'année précédente. Par exemple, le 1er janvier 2010 est un vendredi, ce qui signifie que seulement 3 jours se trouvent dans la semaine calendaire du début 2010. l'ISO 8601 considère donc ces jours comme faisant partie de la semaine 53 (%V) de l'année 2009 (%G) ; la semaine 01 de l'année 2010 pour l'ISO 8601 démarre le lundi 4 janvier 2010. De façon similaire, les deux premiers jours de janvier 2011 sont considérés comme étant dans la semaine 52 de l'année 2010.
La glibc fournit des extensions pour les spécifications de conversion (ces extensions ne sont pas spécifiées par POSIX.1-2001 mais quelques autres systèmes fournissent des fonctionnalités similaires). Entre le caractère « % » et le caractère spécificateur de conversion, on peut spécifier un attribut optionnel et un champ largeur (ceux-ci précèdent les modificateurs E ou 0 s'ils sont présents).
Les caractères attributs suivants sont autorisés :
Un spécificateur de largeur décimal optionnel peut suivre l'(éventuellement absent) attribut. Si la taille naturelle du champ est plus petite que cette largeur, la chaîne résultat sera alors complétée (sur la gauche) jusqu'à la largeur spécifiée.
Si la chaîne de sortie dépasse max octets, errno n'est pas défini. Cela empêche de distinguer ce cas d'erreur des cas où la chaîne format aurait légitimement produit une chaîne de sortie de longueur nulle. POSIX.1-2001 ne spécifie aucun réglage de errno pour strftime().
Certaines versions boguées de gcc(1) se plaignent de l'utilisation de %c : avertissement : `%c' laisse seulement les 2 derniers chiffres de l'année dans certaines configurations linguistiques . Bien sûr, les programmeurs sont encouragés à utiliser %c, car cela donne la représentation préférée de date et d'heure. Il y a eu des tas d'astuces bizarres pour éviter ce problème de gcc(1). Une relativement propre est d'utiliser une fonction intermédiaire
size_t my_strftime(char *s, size_t max, const char *fmt, const struct tm *tm) { return strftime(s, max, fmt, tm); }
De nos jours, gcc(1) fournit une option -Wno-format-y2k pour éviter l'avertissement, et la solution de contournement ci-dessus n'est plus nécessaire.
format de date compatible RFC 2822 (avec des paramètres régionaux en anglais pour %a et %b)
"%a, %d %b %Y %T %z"
format de date compatible RFC 822 (avec des paramètres régionaux en anglais pour %a et %b)
"%a, %d %b %y %T %z"
Le programme suivant peut être utilisé pour expérimenter strftime().
Voici quelques exemples de la chaîne résultat produite par l'implémentation de strftime() dans la glibc :
$ ./a.out '%m' La chaîne résultat est "11" $ ./a.out '%5m' La chaîne résultat est "00011" $ ./a.out '%_5m' La chaîne résultat est " 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 a renvoyé 0"); exit(EXIT_FAILURE); } printf("Result string is \"%s\"\n", outstr); exit(EXIT_SUCCESS); }
date(1), time(2), ctime(3), nl_langinfo(3), setlocale(3), sprintf(3), strptime(3)
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Grégoire Scano <gregoire.scano@malloc.fr>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.
5 février 2023 | Pages du manuel de Linux 6.03 |