15

C++でHH::MM::SS方式で時間を節約する方法を探しています。私はここでそれらが多くの解決策であることを知り、少し研究した後、私はとを選びましtimelocaltime。ただし、次のように表示されるため、関数localtime少し注意が必要なようです。

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タイムスタンプは正しいですが、現地時間はすべてを台無しにします。

私の質問は、タイムスタンプまたはタイプtime_tを人間が読める時間に変換するにはどうすればよいですか?

4

4 に答える 4

20

localtimeとの再入可能性が心配な場合は、 複数の呼び出しを処理できるとgmtimeがあります。localtime_rgmtime_r

時間を好みに合わせてフォーマットする場合は、機能を確認してくださいstrftime

于 2011-11-07T09:10:07.760 に答える
4

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(保存と操作用)のままにしておく必要があります。表示変換用にオブジェクトを変換しているだけなので、すぐに印刷すれば問題は発生しません。

于 2011-11-07T10:13:44.420 に答える
0

localtimeレガシーインターフェイスと最もよく考えられるものがあります。たとえば、マルチスレッドコードでは使用できません。localtime_rマルチスレッド環境では、 Posixまたは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;

(フォーマットを引数として使用する、より一般的なフォーマット関数を作成することもできます。)

于 2011-11-07T10:24:19.730 に答える
-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);
  }
}
于 2014-07-03T10:09:35.860 に答える