__DATE__宏的不同格式
Different format of __DATE__ macro
C有一个预定义的宏__DATE__
,它显示编译的源文件的日期
日期显示格式为"Mmm-dd-yyyy"。
有什么方法可以使用宏来格式化这个日期吗
采用此格式"yyyy-Mmm-dd"。
而不是:
2013年7月19日
应为:
2013年7月19日
在C中,您可以有一个宏来动态生成具有您喜欢的顺序的复合文字,类似
#define FDATE (char const[]){ __DATE__[7], __DATE__[8], ..., ' ', ... , ' ' }
在所有重要的地方,优化器都应该能够有效地处理这一问题。
如果有人正在寻找将Mmm DD YYYY
转换为仅包含ASCII数字的字符串YYMMDD
(如"220103"
)的方法,那么下面是代码。它应该同时在C和C++中工作:
#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],
' '
};
int main(void)
{
puts(__DATE__);
puts(version);
}
输出:
Jan 3 2022
220103
拆卸(gcc x86_64):
version:
.string "220103"
这里有一个真正的破解:
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);
我想要C++程序中ISO格式的编译日期,所以我想出了这个:
感谢"dc42"提供的解决方案。我想建议一种替代解决方案,根据DATE格式编译月份,这可能对所有人来说都更清楚。
unsigned int compileMonth = (int)__DATE__[0]+(int)__DATE__[1]+(int)__DATE__[2];
compileMonth = compileMonth == 281 ? 1
: compileMonth == 269 ? 2
: compileMonth == 288 ? 3
: compileMonth == 291 ? 4
: compileMonth == 295 ? 5
: compileMonth == 301 ? 6
: compileMonth == 299 ? 7
: compileMonth == 285 ? 8
: compileMonth == 296 ? 9
: compileMonth == 294 ? 10
: compileMonth == 307 ? 11
: compileMonth == 268 ? 12
: 0;
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- TDateTime格式在C++Builder中不会更改
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- clang格式:宏的缩进
- clang格式:禁用排序包含
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 将RGB图像保存为PPM格式
- 询问在设计我的手臂模拟器功能表示格式1
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 如何将strftime中的格式错误作为异常捕获
- 将CHW格式的浮点向量转换为cv::Mat
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 如何以叮当格式设置评论的行长?
- 如何将boost::gregorian::date转换为mm/dd/yyyy格式,反之亦然
- 如何比较格式的两个时间戳"Month Date hh:mm:ss"以检查 +ve 或 -ve 值