C 中 strftime() 函数中的奇怪格式说明符

Strange format specifiers in strftime() function in C

我从 here 那里学习了 C 中与时间相关的函数。他们使用以下示例演示了 strftime() 函数:

#include <stdio.h>
#include <time.h>

#define LEN 150
int main ()
{
   char buf[LEN];
   time_t curtime;
   struct tm *loc_time;

   //Getting current time of system
   curtime = time (NULL);

   // Converting current time to local time
   loc_time = localtime (&curtime);

   // Displaying date and time in standard format
   printf("%s", asctime (loc_time));

   strftime (buf, LEN, "Today is %A, %b %d.\n", loc_time);
   fputs (buf, stdout);
   strftime (buf, LEN, "Time is %I:%M %p.\n", loc_time);
   fputs (buf, stdout);

   return 0;
}

我已经仔细研究过 printf() 中的 %m 说明符。它说 %m 转换说明符不是 C,而是 printf 的 GNU 扩展。 ‘%m’ 转换打印 errno.

中错误代码对应的字符串

我知道 %a 格式说明符是 C99 中的新功能。它以十六进制形式打印浮点数。

但是这个程序中的 %b 和 %I 的目的是什么?我不明白 %b & %I 有什么用?我从来没有听说过这个。 %I 和 %i 一样吗?

strftime() formatting bears no relation to sprintf() 格式化。他们都使用 % 符号和字母,但相似之处仅此而已。使用 strftime() 的全部(也是唯一)目的是控制 date/time 值的打印格式,就像 printf() 用于控制数字和字符串的格式一样数据被打印出来。因为他们做的是完全不同的工作,所以在这两个函数中得到不同的结果(并重用有限的字母表来表示不同的东西)是合理的。

strftime()中:

  • %A 是星期几的本地完整名称。
  • %b 是缩写的月份名称。
  • %d 是一个月中的第几天。
  • %I 是 12 小时格式的小时。
  • %M是分钟。
  • %p 是 AM/PM 指标。

其中,%b%I%M 在标准 printf() 中没有意义,而:

  • %A 以大写字母的十六进制表示法打印 double
  • %dint 打印为小数。
  • %p 打印一个 void * 地址。