如何在 ISO 8601:2004 中替换 __TIMESTAMP__
?
__TIMESTAMP__
Sat Jul 6 02:50:06 2013
对比
__TIMESTAMP_ISO__
2013-07-06T00:50:06Z
最佳答案
噢,乐观主义者!您不会真的期望一个标准会关注另一个标准,对吗?如您所知,__TIMESTAMP__
定义不在标准 C 中。拥有像您建议的 __TIMESTAMP_ISO__
格式会很棒(您总是想要祖鲁时间,还是让本地时区偏移更好?),但坦率地说,最简单的方法它添加的可能是 GCC 和 Clang 等的补丁。
您可以按照 user1034749 的建议尝试使用 asctime()
进行修改的 answer ,但我不想那样做。
在 GCC 4.8.1 中 manual ,有一个有趣的警告抑制:
-Wno-builtin-macro-redefined
Do not warn if certain built-in macros are redefined. This suppresses warnings for redefinition of__TIMESTAMP__
,__TIME__
,__DATE__
,__FILE__
, and__BASE_FILE__
.
这表明您可以尝试:
gcc ... -Wno-builtin-macro-redefined -D__TIMESTAMP__=$(date +'"%Y-%m-%dT%H:%M:%S"') ...
(请注意从 date
中获取字符串所必需的象形文字,并用双引号括起来。)但是,某些早期版本的 GCC 不支持该选项;我不记得以前见过它。您仍然可以重新定义 __TIMESTAMP__
:
$ gcc -std=c99 -Wall -Wextra -O xx.c -o xx
$ ./xx
Fri Jul 5 19:56:25 2013
$ gcc -std=c99 -Wall -Wextra -D__TIMESTAMP__=$(date +'"%Y-%m-%dT%H:%M:%S"') -O xx.c -o xx
<command-line>: warning: "__TIMESTAMP__" redefined
$ ./xx
2013-07-05T20:10:28
$
不是很漂亮,但它可以工作......哦,只是为了记录,源代码是(微不足道的):
#include <stdio.h>
int main(void)
{
printf("%s\n", __TIMESTAMP__);
return 0;
}
关于ISO 8601 :2004 中的 C 预处理器 __TIMESTAMP__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17498556/