browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

CTime::GetLocalTm 不是很靠谱

Posted by on 2010 年 03 月 02 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

在 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 不靠谱,也许是我不靠谱,也许还有其它的不靠谱情况——总之,请留意你的函数返回值,即使它看起来永远不会出问题。

订阅本站

5 Comments

  • At 2010.03.11 20:11, Магсн said:

    CTime 是vc++封装的?
    试试看win32 api呢?

    • At 2010.03.11 21:02, 李马 said:

      嗯,忘了加一句:如果只是为了获取当前的日期,可以考虑直接使用 GetLocalTime。

      • At 2010.05.11 10:06, iceknife said:

        因为获取的是指针,所以函数内部应该是一个静态变量然后返回的是静态变量的地址。
        所以多线程调用此函数的时候应该小心!因为返回的数值可能被其他线程更改

        • At 2010.05.11 10:26, 李马 said:

          多线程的问题是次要的,相信没几个人会对这么个简单的 CTime 对象进行跨线程操作。经过调试跟踪,我最终找到了这个问题的所在,比如你可以试试将系统时间改为 2080 年,然后再调用如上代码。

          • At 2010.06.13 13:13, bgh said:

            估计和CTime的时间范围有关吧,只能表示1970–2038年的时间范围

            (Required)
            (Required, will not be published)