您可以从__DATE__
预处理器宏中获取纪元。
在函数下方,该getCompileTimeEpoch()
函数又依赖于另外两个简单的辅助函数,它们返回月份编号和另一个将月份首字母缩写词切换为小写的函数。
令我感到困惑的是, GCC开发人员如何引入了一个带有人类可读日期而不是纪元的宏,从中可以以最大的可靠性导出有关日期的任何其他内容。
__TIME__
如果您需要将它添加到纪元,您可以很容易地从宏中添加时间。
我选择了这个解决方案,因为它将所有内容都保存在代码中并且不依赖于编译器选项。
char *tolowercase(char *letstr){
int l;
for(l=0;l<=strlen(letstr);l++){
if(letstr[l]>=65 && letstr[l]<=92){
letstr[l]=letstr[l]+32;
}
}
return letstr;
}
int getMonFromAbbr(char *abbr){
if (strlen(abbr) > 0)
tolowercase(abbr);
if ( strcmp(abbr, "jan") == 0 )
return 0;
if ( strcmp(abbr, "feb") == 0 )
return 1;
if ( strcmp(abbr, "mar") == 0 )
return 2;
if ( strcmp(abbr, "apr") == 0 )
return 3;
if ( strcmp(abbr, "may") == 0 )
return 4;
if ( strcmp(abbr, "jun") == 0 )
return 5;
if ( strcmp(abbr, "jul") == 0 )
return 6;
if ( strcmp(abbr, "aug") == 0 )
return 7;
if ( strcmp(abbr, "sep") == 0 )
return 8;
if ( strcmp(abbr, "oct") == 0 )
return 9;
if ( strcmp(abbr, "nov") == 0 )
return 10;
if ( strcmp(abbr, "dec") == 0 )
return 11;
return(-1);
}
// Convert from __DATE__ macro
uint64_t getCompileTimeEpoch(){
char date_macro[20]="";
strcpy(date_macro, __DATE__);
char *token;
int yea=0;
int mon=0;
int day=0;
token=strtok(date_macro, " ");
if (token != NULL){
mon=getMonFromAbbr(token);
token=strtok(NULL, " ");
if (token != NULL){
day=atoi(token);
token=strtok(NULL, " ");
if (token != NULL){
yea=atoi(token);
struct tm t;
time_t epoch_t;
t.tm_year = yea-1900; // Year - 1900
t.tm_mon = mon; // Month, where 0 = jan
t.tm_mday = day; // Day of the month
t.tm_hour = 0;
t.tm_min = 0;
t.tm_sec = 0;
t.tm_isdst = 0; // Is DST on? 1 = yes, 0 = no, -1 = unknown
epoch_t = mktime(&t);
return epoch_t;
}
}
}
return(-1);
}