2011-11-07 13 views
12

私は、HH :: MM :: SSファッションで時間を節約する方法をC++で探しています。私は彼らが多くの解決策であることをここに見て、少し研究した後、私はtimelocaltimeを選んだ。 localtime機能は少しトリッキーですようしかし、それsays以来、思わ:C++:時間と現地時間でどのように実際の時間を取得するのですか?

すべてがそう 各呼び出しは、前の呼び出しの結果を上書きし、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を人間が判読可能な時間に変換するにはどうすればよいですか?

答えて

18

あなたはlocaltimegmtimeで再入を心配している場合は、複数のコールを処理することができlocaltime_rgmtime_rがあります。

好きな時間にフォーマットするときは、機能strftimeをチェックしてください。

+1

+1。私は* _rについて知りませんでした!ありがとう! – Viet

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(保存と操作用)にしてください。表示変換のためのオブジェクトを変換するだけなので、すぐに印刷して、その後は間違ってしまうことはありません。

+0

+1明確にするために、私は最後に変換を行うだけです。ありがとう! – seb

0

localtimeには、従来のインターフェイスと見なされるものがあります。たとえば、マルチスレッドコードでは を使用できません。マルチスレッドの 環境では、Posixではlocaltime_rlocaltime_s はWindowsで使用できます。そうでなければ、あなたがしなければならないのは、結果を保存します、しかし、唯一にして例えば、出力をフォーマットする直前localtime
を呼び出す

tm then = *localtime(&t1); 
// ... 
tm now = *localtime(&t2); 

それはおそらくより多くの慣用的な次のようになります。

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; 

(より一般的な書式設定機能を作成することもできます。これには 形式を引数として指定します。)

-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); 
    } 
} 
+0

これは質問に答えることができないと思います。 (time_tを人間が判読可能な形式で表示する方法) – andrel

+0

あなたが答える前に質問をお読みください –

関連する問題