首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 ><ctime>的替代方案

<ctime>的替代方案
EN

Stack Overflow用户
提问于 2012-11-15 10:17:14
回答 2查看 5.2K关注 0票数 6

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-15 10:34:30

C++11包含<chrono>报头,该报头提供具有now函数的不同类型的时钟(我将使用高分辨率的时钟)。您可以将从now()接收到的时间减去两次,得到它们之间的<unit>总数(我将使用秒):

代码语言:javascript
复制
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

但是,请注意,除非时钟的is_steady成员为true,否则不能保证secondsElapsed为正,因为该成员为true意味着后续调用now()时将提供比前一次调用now()时更大的数字。

票数 11
EN

Stack Overflow用户

发布于 2012-11-15 10:47:01

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

C++11提供了一个新的io操纵器std::put_time,它确实取代了C风格的函数,并且与C++的语言环境相关特性完全兼容。

具体地说,给定一个C样式tm格式的时间点:

代码语言:javascript
复制
std::time_t t = std::time(NULL);
std::tm tm = *std::localtime(&t);

如果使用特定于区域设置的格式参数,例如%c (特定于区域设置的日期/时间)、%Ec (特定于区域设置的扩展日期/时间,如日本的英制年份)或%Z (时区),则std::put_time可以根据任何选定的区域设置打印此信息:

代码语言:javascript
复制
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';

这些调用输出如下内容:

代码语言:javascript
复制
2012年11月15日 11時49分04秒 JST     // first call
平成24年11月15日 10時49分05秒 JST   // second call

另一个答案中提到的来自<chrono>的时间点检索函数也可以使用to_time_t方法转换为tm结构,然后与put_time一起使用。这使得代码独立于任何C风格的函数调用,至少在表面上是这样:

代码语言:javascript
复制
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>持续时间类型相结合,这为计算和打印日期和时间提供了极大的灵活性:

代码语言:javascript
复制
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';

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

代码语言:javascript
复制
#include <iostream>
#include <iomanip>
#include <ctime>
#include <chrono>

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13390620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档