strftime 函数中 %s 的历史意义是什么?为什么没有记录?

问题描述 投票:0回答:1

在使用其

iperf3
功能时,我一直在使用
--timestamps
等工具,该功能在幕后使用
strftime
来格式化时间。虽然我已经看到 examples 显示了用于纪元时间戳的转换说明符
%s
,但我还没有看到关于其使用的 official Documentation。在 strftime.c 的源代码中,没有任何注释/注释提及文档中没有它。虽然该功能似乎很适合我的目的,但我遇到了建议提及主要与Python日期时间模块相关)警告不要依赖这种格式。

我很想了解使用

%s
的含义,包括任何历史背景。任何有关此主题的见解或知识将不胜感激!

c strftime
1个回答
0
投票

%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')
可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.