6

我正在寻找<ctime>库的 C++11 版本。C ++ 11中是否包含这样的内容?

编辑:任何具有更多功能的东西都是完美的!

编辑 2:我希望将它与我正在制作的游戏一起使用,以便我可以跟踪总玩的时间。任何对我有帮助的东西都是我正在寻找的。

4

2 回答 2

11

C++11 包含<chrono>头文件,它提供了不同类型的时钟(我将使用高分辨率时钟),它们具有now功能。您可以从中减去其中两个收到的时间,now()以获得它们之间的 s 总数<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>也可以tm使用该方法转换为结构,to_time_t然后与 一起使用put_time。这使得代码独立于任何 C 风格的函数调用,至少在表面上是这样:

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 回答