strftime 中的 %h 和 %b 有什么区别

What is the difference between %h and %b in strftime

我在阅读 strftime(3) 的手册页时发现:

%b The abbreviated month name according to the current locale. (Calculated from tm_mon.)

[...]

%h Equivalent to %b. (SU)

两者是完全一样还是有区别?有没有优先考虑一个的特殊情况?

它们是相同的。

几十年来,出现了许多不同的 Unix 实现,以及许多在字符串表示和日期之间进行转换的不同函数。其中一些函数使用 %b 作为缩写月份,其中一些函数使用 %h。随着时间的推移,除了 strftime 之外的所有遗留接口都被弃用,不同的格式代码被合并,不仅与不同的 strftime 等价物而且与相关的 strptime 函数(解析生成日期的字符串)和命令行 date 实用程序。 (date 的命令行选项之间仍然存在很多差异,但至少核心格式代码是可互操作的。)结果是许多格式代码具有两种不同的拼写。

大多数现代程序都使用 %b,您不太可能找到仅支持 %h 的系统,至少在博物馆之外是这样。但是 %b%h 都是由 Posix 授权的,具有相同的含义,并且没有任何迹象表明 %h 面临弃用。所以你用哪个是你的选择。

它们在行为上是等价的。然而,%hSingle Unix Specification (SU) 中被标准化。这是did not exist in C89.

的补充

实际上从来没有 %h 可以工作但 %b 不工作的情况 - 这意味着您的目标是支持 %h 但不支持 %b 的实现既不符合已有 31 年历史的标准修订版,也不符合其任何修正案。相反的是仍然(不幸的是)更有可能。

TL;DR:始终使用 %b 而不是 %h