在 MFC 中对时间做偏移的时候,往往会使用 CTime 和 CTimeSpan 这两个类。如下面所示:
1 2 3 | CTime t = CTime::GetCurrentTime() - CTimeSpan(2, 0, 0, 0); tm* pt = t.GetLocalTm(NULL); time_t tt = mktime(pt); // oops! |
也许你会说,我做的 oops 标记完全没有道理,因为这段代码是不会有问题的。
但是我的理由是:既然 CTime::GetLocalTm 返回的是一个指针,那么在使用它之前当然应该做出有效性的判断,否则就会有崩溃的危险。事实上,应用程序的崩溃转储曾数次如实地告诉我:CTime::GetLocalTm 的确会在某些情况下返回 NULL,至于原因则不清楚,因为我只能看到一个事发现场。
也许是 CTime 不靠谱,也许是我不靠谱,也许还有其它的不靠谱情况——总之,请留意你的函数返回值,即使它看起来永远不会出问题。
CTime 是vc++封装的?
试试看win32 api呢?
嗯,忘了加一句:如果只是为了获取当前的日期,可以考虑直接使用 GetLocalTime。
因为获取的是指针,所以函数内部应该是一个静态变量然后返回的是静态变量的地址。
所以多线程调用此函数的时候应该小心!因为返回的数值可能被其他线程更改
多线程的问题是次要的,相信没几个人会对这么个简单的 CTime 对象进行跨线程操作。经过调试跟踪,我最终找到了这个问题的所在,比如你可以试试将系统时间改为 2080 年,然后再调用如上代码。
估计和CTime的时间范围有关吧,只能表示1970–2038年的时间范围