有人能建议一种更好的方法来编写以下代码吗?
我希望避免使用boost::time
,因为这会引发链接问题,并且无法使用strptime()
因为我在msvc上。
#include <ctime>
int strtomonth(string s)
{
const char *months[12] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
for (int i=0;i<12;i++)
if (strcmp(months[i],s.c_str())==0)
return i;
return -1;
}
time_t get_compilation_time()
{
stringstream s;
s << __TIMESTAMP__; // formatted like "Tue Dec 6 13:42:54 2011"
string weekday,month;
int day,h,m,sec,year;
char colon;
s >> weekday >> month >> day >> h >> colon >> m >> colon >> sec >> year;
tm compile_time;
compile_time.tm_sec = 0;
compile_time.tm_min = 0;
compile_time.tm_hour = 0;
compile_time.tm_mday = day;
compile_time.tm_mon = strtomonth(month);
compile_time.tm_year = year-1900;
compile_time.tm_isdst = 0;
compile_time.tm_wday = 0;
compile_time.tm_yday = 0;
time_t cmptime = mktime(&compile_time);
return cmptime;
}
(我很欣赏在这种情况下我可以在python中创建一个预构建步骤或类似创建一个“buildtime.h”并保存运行时计算,但是现在这样做并且开销不是问题我'坚持下去。)
但是......如果我弄错了,那么带有未定义行为的C风格的结构初始化,引用什么应该是纯粹的功能代码,声明被丢弃的变量,解析月份字符串我自己 ...哎!还有更好的方法吗?
答案 0 :(得分:4)
但是......如果我弄错了,那么带有未定义行为的C风格的结构初始化,引用什么应该是纯粹的功能代码,声明被丢弃的变量,自己解析月份字符串...哎呀!还有更好的方法吗?
是的!使用外部库。 (如boost::time
)
我想避免使用boost :: time,因为这会引发链接问题
有大量的文档可以让boost
运行/编译,这真的不是那么难。
您始终需要在链接到现有库或自己编写库之间进行权衡。您必须选择哪个选项具有较低的开销/较高的增益。
答案 1 :(得分:2)
您可能需要查看标准C ++库中的'time_get'facet。 http://www.cplusplus.com/reference/std/locale/time_get/
它提供了一些解析日期和时间的函数。您可以在以下位置看到最少的示例:
http://www.cplusplus.com/reference/std/locale/time_get/get_monthname/
http://www.cplusplus.com/reference/std/locale/time_get/get_weekday/
这是一个非常准确的实施方案,可能无法满足您的所有需求。