我知道,这种特殊的事情已被回答了很多次,但我认为,我的问题更多地与一般的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)不会工作。感谢所有人的帮助。干杯!!
答案 0 :(得分:3)
第二个变体将tm
结构的数据复制到您自己的结构中,而第一个变体只使用指针localtime
中的(静态)结构。
答案 1 :(得分:1)
这两个部分的前两行是关键。 localtime()
在静态缓冲区中创建它的输出,如果你只是指向它产生的内容 - 如第一部分所示 - 然后再次调用它,你可能会发现它覆盖了你的第一个指针所指向的内容。 p>
第二个例子稍微好一些,因为你有效地复制了整个对象,尽管在多线程环境中,这仍然有可能最终导致腐败。
使用localtime_r()
会更好,它允许您将缓冲区作为参数传递,因此您不会遇到此问题。
答案 2 :(得分:1)
这两个版本都是有效的代码,但我对此有几点评论:
在第一个版本中,您处理的是您不拥有的数据结构。 tmInfo_11
指向由localtime()提供和管理的内存。当代码增长时,这可能会导致不必要的副作用。所以我认为它很糟糕。
第二个版本是好的样式,但运行速度可能较慢,因为数据结构将被复制。但你必须真正地运行它,而且经常看到相当大的差异。
在第二个版本中,我假设您可以省略对localtime()的调用,因为无论如何都要覆盖结果,除了您显然不使用的时间条目。在第一个版本中,您不能省略localtime(),因为您需要指向其使用的内存的指针。
你说你还没有理解这两个版本之间的差异。因此,我建议重新阅读有关指针的课程,以及它们何时有效以及何时不在好的教科书中。