如何在ISO 8601:2004中进行__TIMESTAMP__
替换?__TIMESTAMP__
Sat Jul 6 02:50:06 2013
对
__TIMESTAMP_ISO__
2013-07-06T00:50:06Z
最佳答案
哦,乐观主义者!你不会真的期望一个标准关注另一个标准吧?__TIMESTAMP__
定义不在标准c中,正如您所知。有一个像您提议的__TIMESTAMP_ISO__
这样的格式会很好(您总是想要zulu时间,还是最好有本地时区偏移量?)但是坦率地说,最简单的添加方法可能是gcc和clang等的补丁。
你可以按照user1034749的建议用asctime()
玩游戏,但我不想那样做。
在GCC4.8.1answer中,有一个有趣的警告抑制:-Wno-builtin-macro-redefined
如果重新定义了某些内置宏,则不要发出警告。这将抑制重新定义__TIMESTAMP__
、__TIME__
、__DATE__
、__FILE__
和__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;
}