C有一个预定义的宏__DATE__
,它显示已编译源文件的日期
日期以“Mmm dd yyyy”格式显示。
有没有办法使用宏来格式化这个日期?
以这种格式“yyyy Mmm dd”。
而不是:
2013年7月19日
应该是:
2013年7月19日
答案 0 :(得分:9)
在C中,您可以拥有一个宏,可以动态生成具有您喜欢的顺序的复合文字,例如
#define FDATE (char const[]){ __DATE__[7], __DATE__[8], ..., ' ', ... , '\0' }
在所有重要的地方你的优化器应该能够有效地处理这个问题。
答案 1 :(得分:3)
这是一个真正的黑客:
union {
const char DOUBLE_DATE[18];
const char PAD[19];
} DATE_HELPER = { __DATE__ " " __DATE__ };
const char *MY_DATE = DATE_HELPER.DOUBLE_DATE + 7;
答案 2 :(得分:0)
我想要在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);