ctime()和日期/时间转换

时间:2012-04-19 13:54:49

标签: c++ linux string date ctime

我知道,这种特殊的事情已被回答了很多次,但我认为,我的问题更多地与一般的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 );
}

我的问题是:这两组代码有什么区别?无论哪种方式,我都可以实现同样的目标。显着的区别是每组的前两行,我不得不承认我并不了解所有这些。所以,有人可以向我解释一下吗?另外,剂量1比其他剂量有任何优点/缺点吗?干杯!

<小时/> 仅仅是为了完整性,这是我最终得到的代码,它给了我想要的结果。所以,基本上它是为了将来的参考:

#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被覆盖),否则strftime()中的年份(%Y)不会工作。感谢所有人的帮助。干杯!!

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

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

第二个版本是好的样式,但运行速度可能较慢,因为数据结构将被复制。但你必须真正地运行它,而且经常看到相当大的差异。

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

你说你还没有理解这两个版本之间的差异。因此,我建议重新阅读有关指针的课程,以及它们何时有效以及何时不在好的教科书中。