6

ライブラリのC++11バージョンを探してい<ctime>ます。このようなものはC++11に含まれていましたか?

編集:より多くの機能を備えたものなら何でも完璧です!

編集2:プレイした合計時間を追跡できるように、これを自分が作成しているゲームで使用したいと考えています。それで私を助けるものは何でも私が探しているものです。

4

2 に答える 2

11

C ++ 11には、機能<chrono>を備えたさまざまなタイプのクロック(高解像度のものを使用します)を提供するヘッダーが含まれていnowます。から受け取ったこれらの時間の2つを引くと、それらの間now()の合計数<unit>(秒を使用します)を取得できます。

using clock = std::chrono::high_resolution_clock;
using unit = std::chrono::seconds;
std::chrono::time_point<clock> startTime = clock::now(); //get starting time

... //do whatever stuff you have to do

std::chrono::time_point<clock> thisTime = clock::now();
long long secondsElapsed = std::chrono::duration_cast<unit>(thisTime - startTime).count();

//now use secondsElapsed however you wish
//you can also use other units, such as milliseconds or nanoseconds

ただし、クロックsecondsElapsedのメンバーが正であるとは限らないことに注意してください。そのメンバーは、の後続の呼び出しが前のの呼び出しよりも大きな番号を与えることを意味するためです。is_steadytruetruenow()now()

于 2012-11-15T02:34:29.583 に答える
9

の関数の多く<ctime>、特にctime関数自体は、日付と時刻を文字列としてフォーマットする必要があります。

C ++ 11は、新しいio-manipulatorを提供しますstd::put_time。これは、実際にCスタイルの関数を置き換え、C++のロケール関連の機能と完全に互換性があります。

tm具体的には、Cスタイル形式の時点を指定します。

std::time_t t = std::time(NULL);
std::tm tm = *std::localtime(&t);

std::put_time%c(ロケール固有の日付/時刻)、%Ec(ロケール固有、日本の帝国年などの拡張日時)、または%Z(タイムゾーン)などのロケール固有のフォーマットパラメータの場合、選択したロケールに従ってこれを印刷できます。使用されています:

std::cout.imbue(std::locale("ja_JP.utf8"));
std::cout << "ja_JP: " << std::put_time(&tm, "%c %Z") << '\n';
std::cout << "ja_JP: " << std::put_time(&tm, "%Ec %Z") << '\n';

これらの呼び出しは次のように出力されます。

2012年11月15日 11時49分04秒 JST     // first call
平成24年11月15日 10時49分05秒 JST   // second call

他の回答で言及されているからの時点検索関数は、メソッドを使用して構造体に<chrono>変換し、と一緒に使用することもできます。これにより、少なくとも表面的には、コードがCスタイルの関数呼び出しから独立します。tmto_time_tput_time

using namespace std;
auto now = chrono::system_clock::now();

time_t now_c = chrono::system_clock::to_time_t(now);
cout << "Locale-specific time now: "
     << put_time(localtime(&now_c), "%c %Z") << '\n';

期間タイプと組み合わせると<chrono>、日付と時刻の計算と印刷に大きな柔軟性がもたらされます。

time_t now_c = chrono::system_clock::to_time_t(now - chrono::hours(48));
cout << "Locale-specific time on the day before yesterday: "
     << put_time(localtime(&now_c), "%c %Z") << '\n';

上記のすべての関数呼び出しに必要なヘッダーは次のとおりです。

#include <iostream>
#include <iomanip>
#include <ctime>
#include <chrono>

可用性に関する注意MSVCとClangについてはよくわかりませんが、残念ながら、GCCはstd::put_timeまだ機能を提供していません: http://gcc.gnu.org/bugzilla/show_bug.cgi?id= 54354

于 2012-11-15T02:47:00.807 に答える