strftime(3) Library Functions Manual strftime(3) NOM strftime - Formater la date et l'heure BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #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); DESCRIPTION La fonction strftime() formate les divers champs de la structure tm en fonction de la chaine de specification format, puis place le resultat dans la chaine s de taille max. Le detail de la structure tm est donne dans . Consultez egalement ctime(3). La specification de format est une chaine terminee par l'octet NULL, qui peut contenir des sequences de caracteres speciales appelees specifications de conversion, chacune commencant par un caractere << % >> et se terminant par un autre caractere, appele caractere specificateur de conversion. Toutes les autres sequences de caracteres sont des sequences de caracteres ordinaires. Les caracteres des sequences de caracteres ordinaires (y compris l'octet NULL) sont copies tels quels depuis format dans s. Cependant, les caracteres indicateurs de conversion sont remplaces comme montre dans la liste ci-dessous. Dans cette liste, le(s) champ(s) de la structure tm employes sont egalement detailles. %a Le nom abrege du jour de la semaine en fonction de la localisation en cours, determine par tm_wday. Les noms specifiques utilises par chaque locale peuvent etre obtenus par un appel a nl_langinfo(3) avec ABDAY_{1-7} comme argument. %A Le nom complet du jour de la semaine en fonction de la localisation en cours, determine par tm_wday. Les noms specifiques utilises la locale en cours peuvent etre obtenus par un appel a nl_langinfo(3) avec DAY_{1-7} comme argument. %b Le nom du mois abrege en fonction de la localisation en cours, determine par tm_mon. Les noms specifiques utilises par chaque locale peuvent etre obtenus par un appel a nl_langinfo(3) avec ABMON_{1-12} comme argument. %B Le nom complet du mois en fonction de la localisation en cours, determine par tm_mon. Les noms specifiques utilises par chaque locale peuvent etre obtenus par un appel a nl_langinfo(3) avec MON_{1-12} comme argument. %c La representation usuelle de la date et de l'heure en fonction de la localisation en cours. Le formatage specifique utilise par la locale en cours peut etre obtenu par un appel a nl_langinfo(3) avec D_T_FMT comme argument pour la specification de conversion %c, et ERA_D_T_FMT pour la specification de conversion %Ec. Cela est equivalent pour la locale POSIX a %a %b %e %H:%M:%S %Y. %C Le siecle (annee/100) sous forme d'un nombre a deux chiffres, determine par tm_year (SU). L'indicateur de conversion %EC correspond au nom de l'ere. %d Le jour du mois sous forme de nombre decimal, entre 01 et 31, determine par tm_mday. %D Equivalent a %m/%d/%y. Uniquement pour les americains. Ces derniers doivent noter que les autres pays preferent le format %d/%m/%y. Dans un contexte international, ce format est ambigu et doit etre evite. (SU) %e Comme %d, le jour du mois sous forme decimale, determine par tm_day, mais l'eventuel zero en tete est remplace par une espace (SU). %E Modificateur : utiliser un format de rechange. Voir plus bas (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 Comme %G, mais sans le siecle, c'est-a-dire avec une annee sur deux chiffres [00-99], determinee par tm_year, tm_yday et tm_wday (TZ). %h Equivalent a %b (SU). %H L'heure, sur 24 heures, sous forme de nombre decimal (entre 00 et 23), determinee par tm_hour. %I L'heure, sur 12 heures, sous forme de nombre decimal (entre 01 et 12), determinee par tm_hour. %j Le numero du jour dans l'annee (entre 001 et 366), determinee par tm_day. %k L'heure (sur 24 heures) sous forme de nombre decimal (intervalle 0 a 23) ; les chiffres uniques etant precedes d'un blanc (voir aussi %H), determinee par tm_hour (TZ). %l L'heure (sur 12 heures) sous forme de nombre decimal (intervalle 1 a 12), les chiffres uniques etant precedes d'un blanc (voir aussi %I), determinee par tm_hour (TZ). %m Le numero du mois (entre 01 et 12), determine par tm_mon. %M La minute, sous forme de nombre decimal (de 00 a 59), determinee par tm_min. %n Un caractere de saut de ligne (SU). %O Modificateur : utiliser des symboles numeriques alternatifs. Voir plus bas (SU). %p L'une des deux chaines << AM >> ou << PM >> en fonction de l'heure, determinee par tm_hour, ou la traduction de ces chaines en fonction de la localisation en cours. Midi est traite comme << PM >> et minuit comme << AM >>. La representation textuelle des chaines << AM >> et << PM >> specifique a la locale en cours peut etre obtenue par un appel a nl_langinfo(3) avec AM_STR ou PM_STR comme argument respectif. %P Comme %p mais en minuscule : << am >> ou << pm >> ou une chaine locale equivalente, determinee par tm_hour (GNU). %r L'heure au format 12 heures (SU). Le format utilise par la locale courante peut etre obtenu en appelant nl_langinfo(3) avec T_FMT_AMPM comme argument. Dans la locale POSIX, cela est equivalent a %I:%M:%S %p. %R L'heure au format 24 heures, %H:%M (SU). Pour avoir les secondes consultez %T. %s Le nombre de secondes ecoulees depuis l'Epoque, 1er janvier 1970 a 00:00:00 UTC, determine par mktime(tm) (TZ). %S La seconde, sous forme de nombre decimal (entre 00 et 60), l'intervalle pouvant etre superieur a 60 pour autoriser des secondes de rattrapage, determinee par tm_sec. %t Un caractere de tabulation (SU). %T L'heure en notation 24 heures, %H:%M:%S (SU). %u Le jour de la semaine sous forme decimale, de 1 (lundi) a 7, determine par tm_wday. Consultez aussi %w (SU). %U Le numero de la semaine dans l'annee, sous forme de nombre decimal entre 00 et 53, en commencant le comptage au premier dimanche de l'annee, determine par tm_yday et tm_wday. Consultez aussi %V et %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 Le numero du jour de la semaine, sous forme decimale dans l'intervalle 0-6, dimanche valant 0, determine par tm_wday. Consultez aussi %u. %W Le numero de la semaine dans l'annee, sous forme de nombre decimal (00-53), en commencant avec le premier lundi comme premier jour de la semaine 01, determine par tm_yday et tm_wday. %x La representation usuelle de la date sans l'heure pour la locale en cours. Le format specifique a la locale en cours peut etre obtenu par un appel a nl_langinfo(3) avec D_FMT comme argument pour l'indicateur de conversion %x et ERA_D_FMT pour l'indicateur de conversion %Ex. Cela est equivalent a %m/%d/%y dans la locale POSIX. %X La representation usuelle de l'heure sans la date pour la locale en cours. Le format specifique a la locale en cours peut etre obtenu par un appel a nl_langinfo(3) avec T_FMT comme argument pour l'indicateur de conversion %X et ERA_T_FMT pour l'indicateur de conversion %EX. Cela est equivalent a %H:%M:%S dans la locale POSIX. %y L'annee, sous forme de nombre decimal, sans le siecle (comprise entre 00 et 99), determinee par tm_year. L'indicateur de conversion %Ey correspond a l'annee depuis le debut de l'ere, designee par l'indicateur de conversion %EC. %Y L'annee, sous forme de nombre decimal, incluant le siecle, determinee par tm_year. L'indicateur de conversion %EY correspond a la representation alternative complete d'une annee. %z Le fuseau horaire (c'est-a-dire le decalage en heures et minutes par rapport a UTC) sous forme numerique +hhmm ou -hhmm (SU). %Z Le nom ou l'abreviation du fuseau horaire. %+ La date et l'heure au format date(1), non pris en charge par la glibc2 (TZ). %% Un caractere << % >>. Certaines specifications de conversion peuvent etre modifiees en faisant preceder le caractere specificateur 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 modifie. Les specifications Single UNIX (SU) mentionnent %Ec, %EC, %Ex, %EX, %Ey, %EY, %Od, %Oe, %OH, %OI, %Om, %OM, %OS, %Ou, %OU, %OV, %Ow, %OW, %Oy, ou l'action du modificateur O est d'utiliser un autre format numerique (par exemple des chiffres romains), et l'action de E est d'utiliser une representation dependante de la localisation. Les regles encadrant la representation des dates avec l'indicateur E peuvent etre obtenues par un appel a nl_langinfo(3) avec ERA pour argument. Un exemple d'une telle forme alternative est le schema de calendrier d'ere japonais dans la locale ja_JP de la glibc. LA fonction strftime_l() est equivalente a strftime(), a part qu'elle utilise la localisation locale specifiee a la place de la locale en cours. Le comportement est indefini si locale n'est pas valable ou est LC_GLOBAL_LOCALE. VALEUR RENVOYEE Si la taille de la chaine de resultat ne depasse pas max octets (octet NULL compris), la fonction strftime() renvoie le nombre d'octets ecrits dans le tableau s, sans compter l'octet NULL final. Si la longueur de la chaine depasse max octets (octet NULL compris), strftime() renvoie 0 et le contenu de la chaine est indefini. Remarquez qu'une valeur de retour nulle n'indique pas toujours une erreur. Dans de nombreuses localisations, par exemple, %p renvoie une chaine vide. Une chaine format vide renvoie aussi une chaine vide. ENVIRONNEMENT Les variables d'environnement TZ et LC_TIME sont utilisees. ATTRIBUTS Pour une explication des termes utilises dans cette section, consulter attributes(7). +----------------------+--------------------------+--------------------+ |Interface | Attribut | Valeur | +----------------------+--------------------------+--------------------+ |strftime(), | Securite des threads | MT-Safe env locale | |strftime_l() | | | +----------------------+--------------------------+--------------------+ STANDARDS strftime() C11, POSIX.1-2008. strftime_l() POSIX.1-2008. HISTORIQUE strftime() SVr4, C89. strftime_l() POSIX.1-2008. Il y a une inclusion stricte entre les jeux de conversions fournies par ANSI C (sans marque), celles indiquees par les Specifications Single UNIX (marquees SU), celles fournies par le paquet timezone d'Olson (marquees TZ), et celles de la glibc (marquees GNU), sauf pour %+ qui n'est pas pris en charge par la glibc2. D'un autre cote glibc2 offre plusieurs extensions. POSIX.1 ne traite que les conversions ANSI C. POSIX.2 decrit a propos de date(1) plusieurs extensions applicables egalement a strftime(). La conversion %F est dans C99 et POSIX.1-2001. Dans SUSv2, le %S specifie permettait un intervalle de 00 a 61, pour autoriser la possibilite theorique d'une minute incluant une double seconde de rattrapage (il n'y a jamais eu de telle minute). NOTES 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. Notes de la glibc La glibc fournit des extensions pour les specifications de conversion (ces extensions ne sont pas specifiees par POSIX.1-2001 mais quelques autres systemes fournissent des fonctionnalites similaires). Entre le caractere << % >> et le caractere specificateur de conversion, on peut specifier un attribut optionnel et un champ largeur (ceux-ci precedent les modificateurs E ou 0 s'ils sont presents). Les caracteres attributs suivants sont autorises : _ (souligne) Completer une chaine de resultat numerique avec des espaces. - (tiret) Ne pas completer une chaine de resultat numerique. 0 Completer une chaine de resultat numerique avec des zeros meme si le caractere specificateur de conversion utilise des espaces par defaut. ^ Convertir une chaine alphabetique en une chaine resultante en majuscule. # Echanger la casse de la chaine resultat (cet attribut ne fonctionne qu'avec certains caracteres specificateurs de conversion, et parmi ceux-ci il n'est vraiment utile qu'avec %Z). Un specificateur de largeur decimal optionnel peut suivre l'(eventuellement absent) attribut. Si la taille naturelle du champ est plus petite que cette largeur, la chaine resultat sera alors completee (sur la gauche) jusqu'a la largeur specifiee. BOGUES Si la chaine de sortie depasse max octets, errno n'est pas defini. Cela empeche de distinguer ce cas d'erreur des cas ou la chaine format aurait legitimement produit une chaine de sortie de longueur nulle. POSIX.1-2001 ne specifie aucun reglage de errno pour strftime(). Certaines versions boguees de gcc(1) se plaignent de l'utilisation de %c : avertissement : `%c' laisse seulement les 2 derniers chiffres de l'annee dans certaines configurations linguistiques . Bien sur, les programmeurs sont encourages a utiliser %c, car cela donne la representation preferee de date et d'heure. Il y a eu des tas d'astuces bizarres pour eviter ce probleme de gcc(1). Une relativement propre est d'utiliser une fonction intermediaire 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 eviter l'avertissement, et la solution de contournement ci-dessus n'est plus necessaire. EXEMPLES format de date compatible RFC 2822 (avec des parametres regionaux en anglais pour %a et %b) "%a, %d %b %Y %T %z" format de date compatible RFC 822 (avec des parametres regionaux en anglais pour %a et %b) "%a, %d %b %y %T %z" Programme exemple Le programme suivant peut etre utilise pour experimenter strftime(). Voici quelques exemples de la chaine resultat produite par l'implementation de strftime() dans la glibc : $ ./a.out '%m' La chaine resultat est "11" $ ./a.out '%5m' La chaine resultat est "00011" $ ./a.out '%_5m' La chaine resultat est " 11" Source du programme #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 returned 0"); exit(EXIT_FAILURE); } printf("Result string is \"%s\"\n", outstr); exit(EXIT_SUCCESS); } VOIR AUSSI date(1), time(2), ctime(3), nl_langinfo(3), setlocale(3), sprintf(3), strptime(3) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Gregoire Scano Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 28 janvier 2024 strftime(3)