在使用其
iperf3
功能时,我一直在使用 --timestamps
等工具,该功能在幕后使用 strftime
来格式化时间。虽然我已经看到 examples 显示了用于纪元时间戳的转换说明符 %s
,但我还没有看到关于其使用的 official Documentation。在 strftime.c 的源代码中,没有任何注释/注释提及文档中没有它。虽然该功能似乎很适合我的目的,但我遇到了建议或提及(主要与Python日期时间模块相关)警告不要依赖这种格式。
我很想了解使用
%s
的含义,包括任何历史背景。任何有关此主题的见解或知识将不胜感激!
%s
不是C标准的一部分,它取决于实现。在具有 BSD 根源的 MacOS 上,确实如此。
%s is replaced by the number of seconds since the Epoch, UTC (see mktime(3)).
手册解释...
标准
strftime() 函数符合 ISO/IEC 9899:1990 (“ISO C90”) 并有很多扩展 包括“%C”、“%D”、“%E*”、“%e”、“%G”、“%g”、“%h”、“%k”、“%l”、“%n” ', '%O*', '%R', '%r', ‘%s’、‘%T’、‘%t’、‘%u’、‘%V’、‘%z’和‘%+’。
“%G”、“%g”和“%V”替换中的特殊周数和年份在 ISO 8601: 1988 中定义。
纪元时间是自纪元以来的秒数,因此
%s
。
如果我们查看 NetBSD 中 strftime.c 的第一个版本,我们会看到这一点。
188 1.1 mrg case 's':
189 1.1 mrg if (!_secs(t))
190 1.1 mrg return(0);
191 1.1 mrg continue;
_secs
秒只是mktime
周围的一层薄薄的包装纸。可能 C 标准的人觉得 %s
与 mktime
是多余的,而 BSD 的人觉得它很方便。
许多用 C 实现的语言,例如 Python,仍然依赖于
strftime
,因此仅记录标准语言和一些常见扩展。例如,在 MacOS 上的 Python datetime.now().strftime("%:z")
中,仅打印 :z
,因为 MacOS strftime
不实现 %:z
。而 Ruby 有自己的 strftime
实现 并且 Time.now.strftime('%:z')
可以工作。