<ctime> </ctime>的替代方案

时间:2012-11-15 02:17:14

标签: c++ visual-c++ c++11

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

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

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

2 个答案:

答案 0 :(得分: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

请注意,secondsElapsed不能保证为正,除非时钟的is_steady成员为true,因为该成员为true表示后续拨打now()会比之前拨打now()的号码更多。

答案 1 :(得分: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);

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结构,然后与{一起使用{1}}。这使代码独立于任何C风格的函数调用,至少在表面上:

put_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';

可用性说明我不确定MSVC和Clang,但遗憾的是,GCC尚未提供#include <iostream> #include <iomanip> #include <ctime> #include <chrono> 功能:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54354