<ctime>的替代方案

Tux*_*Tux 5 c++ visual-c++ c++11

我正在寻找该<ctime>库的C++ 11版本.C++ 11中包含这样的内容吗?

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

编辑2:我希望在我正在制作的游戏中使用它,这样我就可以跟踪总的播放时间.任何可以帮助我的东西都是我正在寻找的东西.

chr*_*ris 11

C++ 11包括<chrono>头部,它提供了具有功能的不同类型的时钟(我将使用高分辨率的时钟)now.您可以减去收到的这些时间中的两个,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
Run Code Online (Sandbox Code Playgroud)

但是,请注意,secondsElapsed除非is_steady时钟成员是true因为该成员true意味着后续呼叫now()将提供比之前呼叫更大的号码,否则不能保证是积极的now().

  • 注意:你可能会提到`is_steady`的值.只有当`now()`返回的值单调增加时,这个布尔成员才是'true`.我建议*不要*使用非稳定时钟来测量经过的时间. (2认同)

jog*_*pan 9

其中的许多函数<ctime>,特别是ctime函数本身,都将日期和时间格式化为字符串.

C++ 11提供了一个新的io-manipulator std::put_time,它确实取代了C风格的函数,并且与C++的语言环境相关的功能完全兼容.

具体来说,给定C风格tm格式的时间点:

std::time_t t = std::time(NULL);
std::tm tm = *std::localtime(&t);
Run Code Online (Sandbox Code Playgroud)

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';
Run Code Online (Sandbox Code Playgroud)

这些调用打印如下:

2012?11?15? 11?49?04? JST     // first call
??24?11?15? 10?49?05? JST   // second call
Run Code Online (Sandbox Code Playgroud)

<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';
Run Code Online (Sandbox Code Playgroud)

结合<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';
Run Code Online (Sandbox Code Playgroud)

这些是上面所有函数调用所需的标头:

#include <iostream>
#include <iomanip>
#include <ctime>
#include <chrono>
Run Code Online (Sandbox Code Playgroud)

可用性说明我不确定MSVC和Clang,但不幸的是,GCC还没有提供这个std::put_time功能:http://gcc.gnu.org/bugzilla/show_bug.cgi?id = 54354 .