C 有一个预定义的宏__DATE__
,它显示编译源文件的日期。日期以"Mmm dd yyyy"
格式显示。
有没有办法使用宏来格式化这个日期?
以这种格式"yyyy Mmm dd"。
而不是:
2013 年 7 月 19 日
应该 :
2013 年 7 月 19 日
在 C 中,您可以有一个宏,它可以动态生成具有您喜欢的顺序的复合文字,例如
#define FDATE (char const[]){ __DATE__[7], __DATE__[8], ..., ' ', ... , '\0' }
在所有重要的地方,您的优化器都应该能够有效地处理这个问题。
这是一个真正的黑客:
union {
const char DOUBLE_DATE[18];
const char PAD[19];
} DATE_HELPER = { __DATE__ " " __DATE__ };
const char *MY_DATE = DATE_HELPER.DOUBLE_DATE + 7;
我想要在 C++ 程序中以 ISO 格式编译的日期,所以我想出了这个:
constexpr unsigned int compileYear = (__DATE__[7] - '0') * 1000 + (__DATE__[8] - '0') * 100 + (__DATE__[9] - '0') * 10 + (__DATE__[10] - '0');
constexpr unsigned int compileMonth = (__DATE__[0] == 'J') ? ((__DATE__[1] == 'a') ? 1 : ((__DATE__[2] == 'n') ? 6 : 7)) // Jan, Jun or Jul
: (__DATE__[0] == 'F') ? 2 // Feb
: (__DATE__[0] == 'M') ? ((__DATE__[2] == 'r') ? 3 : 5) // Mar or May
: (__DATE__[0] == 'A') ? ((__DATE__[2] == 'p') ? 4 : 8) // Apr or Aug
: (__DATE__[0] == 'S') ? 9 // Sep
: (__DATE__[0] == 'O') ? 10 // Oct
: (__DATE__[0] == 'N') ? 11 // Nov
: (__DATE__[0] == 'D') ? 12 // Dec
: 0;
constexpr unsigned int compileDay = (__DATE__[4] == ' ') ? (__DATE__[5] - '0') : (__DATE__[4] - '0') * 10 + (__DATE__[5] - '0');
constexpr char IsoDate[] =
{ compileYear/1000 + '0', (compileYear % 1000)/100 + '0', (compileYear % 100)/10 + '0', compileYear % 10 + '0',
'-', compileMonth/10 + '0', compileMonth%10 + '0',
'-', compileDay/10 + '0', compileDay%10 + '0',
0
};
// Test that it gets it right today
#include <cstring>
static_assert(strcmp(IsoDate, "2020-11-06") == 0);
如果有人正在寻找一种方法来转换为 仅包含 ASCII 数字Mmm DD YYYY
的字符串(如),那么这里是代码。它应该在 C 和 C++ 中都可以工作:YYMMDD
"220103"
#include <stdio.h>
const char version[6+1] =
{
// YY year
__DATE__[9], __DATE__[10],
// First month letter, Oct Nov Dec = '1' otherwise '0'
(__DATE__[0] == 'O' || __DATE__[0] == 'N' || __DATE__[0] == 'D') ? '1' : '0',
// Second month letter
(__DATE__[0] == 'J') ? ( (__DATE__[1] == 'a') ? '1' : // Jan, Jun or Jul
((__DATE__[2] == 'n') ? '6' : '7') ) :
(__DATE__[0] == 'F') ? '2' : // Feb
(__DATE__[0] == 'M') ? (__DATE__[2] == 'r') ? '3' : '5' : // Mar or May
(__DATE__[0] == 'A') ? (__DATE__[1] == 'p') ? '4' : '8' : // Apr or Aug
(__DATE__[0] == 'S') ? '9' : // Sep
(__DATE__[0] == 'O') ? '0' : // Oct
(__DATE__[0] == 'N') ? '1' : // Nov
(__DATE__[0] == 'D') ? '2' : // Dec
0,
// First day letter, replace space with digit
__DATE__[4]==' ' ? '0' : __DATE__[4],
// Second day letter
__DATE__[5],
'\0'
};
int main(void)
{
puts(__DATE__);
puts(version);
}
输出:
Jan 3 2022
220103
反汇编(gcc x86_64):
version:
.string "220103"