我正在寻找一种在C ++中以HH :: MM :: SS方式节省时间的方法。我在这里看到它们是很多解决方案,经过一些研究后我选择了time
和localtime
。但是,似乎localtime
函数有点棘手,因为它says:
对localtime和gmtime的所有调用都使用相同的静态结构,所以 每次通话都会覆盖上次通话的结果。
这导致的问题显示在下一段代码中:
#include <ctime>
#include <iostream>
using namespace std;
int main() {
time_t t1 = time(0); // get time now
struct tm * now = localtime( & t1 );
std::cout << t1 << std::endl;
sleep(2);
time_t t2 = time(0); // get time now
struct tm * now2 = localtime( & t2 );
std::cout << t2 << std::endl;
cout << (now->tm_year + 1900) << '-'
<< (now->tm_mon + 1) << '-'
<< now->tm_mday << ", "
<< now->tm_hour << ":" << now->tm_min << ":" << now->tm_sec
<< endl;
cout << (now2->tm_year + 1900) << '-'
<< (now2->tm_mon + 1) << '-'
<< now2->tm_mday << ", "
<< now2->tm_hour << ":" << now2->tm_min << ":" << now2->tm_sec
<< endl;
}
典型的输出是:
1320655946
1320655948
2011-11-7, 9:52:28
2011-11-7, 9:52:28
正如您所看到的,time_t
时间戳是正确的,但本地时间会让一切都变得混乱。
我的问题是:如何将时间戳ot类型time_t
转换为人类可读的时间?
答案 0 :(得分:19)
如果您担心localtime
和gmtime
中的重入,localtime_r
和gmtime_r
可以处理多个来电。
在根据自己的喜好格式化时间时,请检查功能strftime
。
答案 1 :(得分:3)
localtime()调用将结果存储在内部缓冲区中。
每次调用它都会覆盖缓冲区 另一种解决方案是制作缓冲区的副本。
time_t t1 = time(0); // get time now
struct tm* now = localtime( & t1 ); // convert to local time
struct tm copy = *now; // make a local copy.
// ^^^ notice no star.
但请注意:您应该转换为本地时间的唯一时间是显示值。在所有其他时间,您应该将时间保持为UTC(用于存储和操作)。由于您只是转换对象进行显示转换,然后立即打印,然后事情就不会出错。
答案 2 :(得分:0)
localtime
具有最佳的遗留接口。它不可能
例如,在多线程代码中使用。在多线程中
环境,您可以使用Posix下的localtime_r
或localtime_s
在Windows下。否则,您所要做的就是保存结果:
tm then = *localtime( &t1 );
// ...
tm now = *localtime( &t2 );
然而,只有拨打localtime
,才可能更惯用
在格式化输出之前,例如:
std::string
timestampToString( time_t timeAndDate )
{
char results[100];
if ( strftime( results, sizeof( results ), "%Y-%m-%d, %H:%M:%S",
localtime( &timeAndDate) ) == 0 ) {
assert( 0 );
}
return results;
}
然后写:
std::cout << formatTime( t1 ) << std::endl;
(你也可以创建一个更通用的格式化功能 格式作为参数。)
答案 3 :(得分:-1)
您可以使用以下代码运行连续时钟。它工作得很好。
#include<iostream>
#include <Windows.h>
#include<ctime>
using namespace std;
void main() {
while(true) {
system("cls"); //to clear screen
time_t tim;
time(&tim);
cout << ctime(&tim);
Sleep(1);
}
}