相信各位在开发的时候都有点烦代码的版本号要怎么命名,按照什么规律去命名,下面给大家介绍一下两个宏,可以获取每次编译时的年月日时分秒,非常好用! ` DATA TIME //注意是双下划线 这是两个编译器宏定义,keil里有的(我目前只用Keil验证了)。 用途:用于自动获取编译器编译时的当前时间。 –DATE– ------用于获取当前日期—格式— Jul 03 2020 –TIME– ------ 用于获取当前时间—格式—15:52:54 但是以上的格式不太符合我的习惯,所以我必须给他整一下! 我想要的是“年月日时分秒”的格式,所以有了以下的代码。 void get_ver_time(void){ u8 ver_len=0; u8 cnt=0; char time[10]=__TIME__; char ver_time[10]; #define YEAR ((( (__DATE__ [7 ] - '0') * 10 \ + (__DATE__ [8 ] - '0')) * 10 \ + (__DATE__ [9 ] - '0')) * 10 \ + (__DATE__ [10] - '0')) #define MONTH ( __DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? 1 : 6) \ : __DATE__ [2] == 'b' ? 2 \ : __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 3 : 4) \ : __DATE__ [2] == 'y' ? 5 \ : __DATE__ [2] == 'n' ? 6 \ : __DATE__ [2] == 'l' ? 7 \ : __DATE__ [2] == 'g' ? 8 \ : __DATE__ [2] == 'p' ? 9 \ : __DATE__ [2] == 't' ? 10 \ : __DATE__ [2] == 'v' ? 11 : 12) #define DAY ( (__DATE__ [4] == ' ' ? 0 : __DATE__ [4] - '0') * 10 \ + (__DATE__ [5] - '0')) for(int i=0; time!=0; i++) { if(isdigit(time)) { ver_time[cnt]=time; cnt++; } } ver_time[cnt++]=0; ver_len=sprintf(str_ver_time,"V1.0_%d_%02d_%02d_%s",YEAR,MONTH,DAY,ver_time);}获取到 DATE ------用于获取当前日期—格式— Jul 03 2020 年: 是_ DATE_的7-10位,直接用数组取取值后,取出来的ASCII 码,直接用来显示会有点问题,所以要减去0x30,也就是'0', 月份:需要取判断字母,来确定是几月份,具体就是按照每个月份的简称所组成的字母的差异来确定是几月。 日:和年类似,需要进一步第四位是不是空格 ,‘ ’,0x20(因为1-9号是1位数),我们需要补零。 时分秒:使用了isdigit 函数来过滤掉数据之间的空格! 最后打印出来的是,例子:2023 12 24 11 32 00 的纯数值。 注意,获取编译时间需要每一次都编译到才会更新,但是目前的的编译都是增量编译,没有改动的地方不会编译的,所以我们需要设置一下,这个函数所在的文件才可以确保每一次都可以获取到最新的编译时间!! 方法是: 点亮 总是编译即可!
|