最近更新于 2025-10-15 12:03
测试环境
Visual Studio 2022
方案
C/C++ 中有 __DATE__ 和 __TIME__ 两个预定义宏,分别为日期和时间,在程序内作为字符串使用就行。编译器预处理的时候就会获取日期和时间填进去作为常量字符串。

不过这两个字符串都不是宽字符串,在一些特别的情景下,比如 Windows API 系列的项目中,普遍要使用宽字符串。

DATE 和 TIME 是存储的编译时间,我一般把编译时间用作软件版本号。
时间转宽字符串参考
#include <wchar.h>
#include <stdio.h>
constexpr wchar_t WTIME[] = {
__TIME__[0], __TIME__[1], __TIME__[2], __TIME__[3],
__TIME__[4], __TIME__[5], __TIME__[6], __TIME__[7],
__TIME__[8], 0
};
int main(void)
{
wprintf(L"%s\n", WTIME);
return 0;
}

日期我一般用年月日的阿拉伯数字拼接,原始带英文月份的格式就不习惯,下面的代码可以呈现阿拉伯数字格式
#include <stdio.h>
#define MONTH_TO_NUM(mmm) \
((mmm[0] == 'J' && mmm[1] == 'a') ? 1 : \
(mmm[0] == 'F') ? 2 : \
(mmm[0] == 'M' && mmm[2] == 'r') ? 3 : \
(mmm[0] == 'A' && mmm[1] == 'p') ? 4 : \
(mmm[0] == 'M' && mmm[2] == 'y') ? 5 : \
(mmm[0] == 'J' && mmm[2] == 'n') ? 6 : \
(mmm[0] == 'J' && mmm[2] == 'l') ? 7 : \
(mmm[0] == 'A' && mmm[1] == 'u') ? 8 : \
(mmm[0] == 'S') ? 9 : \
(mmm[0] == 'O') ? 10 : \
(mmm[0] == 'N') ? 11 : 12)
#define TO_DIGIT(c) ((c) - '0')
constexpr wchar_t WDATE[] = {
__DATE__[7], __DATE__[8], __DATE__[9], __DATE__[10],
L'/',
(wchar_t)(L'0' + MONTH_TO_NUM(__DATE__) / 10),
(wchar_t)(L'0' + MONTH_TO_NUM(__DATE__) % 10),
L'/',
(wchar_t)((__DATE__[4] == ' ') ? L'0' : __DATE__[4]),
(wchar_t)__DATE__[5],
0
};
int main(void)
{
wprintf(L"%s\n", WDATE);
return 0;
}

C++ 程序内获取编译日期时间
