2

我知道,这种特殊的事情已经被回答了很多次,但我认为,我的问题更多的是与一般 C++ 的东西有关,而不是ctime()日期/时间转换。我只是碰巧用这个试了一下。所以,这里是代码:

#include <iostream>
#include <ctime>

using std::cout;
using std::endl;
using std::string;

void strTime( int iM, int iD, int iY )
{
    time_t rwTime;
    time( &rwTime );            // current epoch time

    // 1st set:: using tmInfo_11
    struct tm *tmInfo_11; 
    tmInfo_11 = localtime( &rwTime );
    tmInfo_11->tm_mon = iM - 1;
    tmInfo_11->tm_mday = iD; 
    tmInfo_11->tm_year = iY - 1900;
    mktime( tmInfo_11 );
    cout << "tmInfo_11 RESULt: " << tmInfo_11->tm_wday << endl;

    // 2nd set:: using tmInfo_22 //
    struct tm tmInfo_22; 
    tmInfo_22 = *localtime( &rwTime );
    tmInfo_22.tm_mon = iM - 1;
    tmInfo_22.tm_mday = iD; 
    tmInfo_22.tm_year = iY - 1900;
    mktime( &tmInfo_22 );
    cout << "tmInfo_22 RESULt: " << tmInfo_22.tm_wday << endl;
}

int main()
{
    int iMM=12, iDD=9, iYY=2009;
    strTime( iMM, iDD, iYY );
}

我的问题是:这两组代码有什么区别?无论哪种方式,我都可以实现同样的目标。显着的区别是每组的前两行,我不得不承认我没有全部理解。那么,任何人都可以向我解释一下吗?此外,第一剂与其他剂相比有什么优势/劣势?干杯!!


只是为了完整起见,这是我最终得到的代码,它给了我想要的结果。所以,基本上它是为了将来参考:

#include <iostream>
#include <fstream>
#include <ctime>

using std::cout;
using std::endl;
using std::string;

tm testTime( int iM, int iD, int iY );

int main()
{
    char tmBuff[20];
    int iMM=12, iDD=9, iYY=2009;

    tm myDate = testTime( iMM, iDD, iYY );
    strftime( tmBuff, sizeof(tmBuff), "%a, %b %d, %Y", &myDate );
    cout << "TESt PRINt TIMe: " << tmBuff << endl;
}

tm testTime( int iM, int iD, int iY ) 
{
    time_t rwTime; 

    struct tm tmTime;
    tmTime = *localtime( &rwTime );

    tmTime.tm_mon = iM - 1;
    tmTime.tm_mday = iD; 
    tmTime.tm_year = iY - 1900;
    mktime( &tmTime );
    return tmTime;
}

请注意,它确实需要*localtime( &rwTime )指定 (即使 tmTime 之后被覆盖),否则 中的 Year(%Y)strftime()不起作用。感谢大家的帮助。干杯!!

4

3 回答 3

3

第二个变体将结构的数据复制tm到您自己的结构中,而第一个变体只是使用指向 中的(静态)结构的指针localtime

于 2012-04-19T13:59:19.340 回答
1

两个版本都是有效代码,但我对此有几点评论:

在第一个版本中,您使用的是您不拥有的数据结构。tmInfo_11指向由 localtime() 提供和管理的内存。当您的代码增长时,这可能会导致不必要的副作用。所以我认为这是不好的风格。

第二个版本的风格不错,但运行速度可能会慢一些,因为数据结构会被复制。但是您必须非常非常频繁地运行它才能看到相当大的差异。

在第二个版本中,我假设您可以省略对 localtime() 的调用,因为无论如何您都会覆盖结果,除了您显然不使用的时间条目。在第一个版本中,您不能省略 localtime(),因为您需要指向您使用的内存的指针。

你说你不明白这两个版本的区别。因此,我建议再次重温关于指针的课程以及它们何时有效以及何时不在一本好的教科书中。

于 2012-04-19T15:29:09.203 回答
1

这两个部分的前两行是关键。localtime()在静态缓冲区中创建它的输出,如果您只是将指针指向它产生的内容(如在第一部分中所示)然后再次调用它,您可能会发现它会覆盖您的第一个指针指向的内容。

第二个示例稍微好一些,因为您有效地复制了整个对象,尽管在多线程环境中仍然有可能最终导致损坏。

更好地使用localtime_r()它允许您将缓冲区作为参数传递,这样您就不会遇到这个问题。

于 2012-04-19T14:00:37.303 回答