c++ - 在 C++11 中处理毫秒的正确方法是什么
问题描述
我正在尝试将我的项目的基本开发库从 C++98 更新到 C++11。
在dev库中,有很多关于时间的函数,比如
uint64_t getCurrentMSTime()
{
struct timeval stv;
gettimeofday(&stv, NULL);
uint64_t ms = stv.tv_sec ;
ms = ms * 1000 + stv.tv_usec / 1000;
return ms;
}
我正在尝试用std::chrono
C++11 来改变它。
目前看来我有两种选择,一种是返回time_point
,另一种是立即返回std::chrono::milliseconds::rep
std::chrono::time_point<std::chrono::system_clock> getCurrentTime1() {
return std::chrono::system_clock::now();
}
std::chrono::milliseconds::rep getCurrentTime2() {
return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
}
好吧,我知道第一个更灵活,因为它返回 a time_point
,这意味着我们可以将它转换为毫秒、纳秒、秒等,而第二个只返回毫秒。
但是假设开发人员只使用毫秒,所以我们可以忽略灵活的问题。
在这种情况下,哪个更好?
顺便说一句,开发人员会做这样的事情:std::map<std::string, ???> mp;
. 所以我的代码将决定这???
部分。
std::map<std::string, std::chrono::time_point<std::chrono::system_clock>> mp{std::string("abc"), getCurrentTime1()};
与
std::map<std::string, std::milliseconds::rep> mp{std::string("abc"), getCurrentTime2()};
。
哪一个更好?还是它们几乎一样?
解决方案
我同意当前接受的答案,即您应该重视类型安全,而不是返回整数类型。但是我不同意返回milliseconds
是最好的。
类型安全也适用于时间点和持续时间之间的差异。例如,添加两个持续时间非常有意义。但是添加两个时间点是荒谬的,尽管您可以将它们相减以产生持续时间。
由于 的含义getCurrentTime()
是返回当前时间点,因此应该返回 a std::chrono::time_point
。可以很容易地选择精确地返回一个time_point
基于:system_clock
milliseconds
std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>
getCurrentTime()
{
return std::chrono::time_point_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now());
}
在 C++20 中,此类型有一个方便的类型别名,以使其更容易拼写。如果您想抢先一步,可以为自己创建这样的类型别名:
std::chrono::sys_time<std::chrono::milliseconds>
getCurrentTime()
{
return std::chrono::time_point_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now());
}
或者您可以创建一个更短的名称以在您的应用程序中使用,例如:
using MSTime = std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>;
...
MSTime
getCurrentMSTime()
{
return std::chrono::time_point_cast<MSTime::duration>(
std::chrono::system_clock::now());
}
推荐阅读
- unity3d - 如何在游戏环境中添加阴影
- python - Kivy 不同小部件和布局类之间的属性和通信
- javascript - 如何根据图表中条形的宽度Highcharts最大高度
- c# - C# - 如何在屏幕边缘检测鼠标光标移动?
- java - 使用 spring boot 和 hibernate jpa 存储库进行事务测试
- c - 为什么 while (1 < a < 5) 是无限循环?
- linux - 如何在远程服务器上自动执行数十条命令
- android - Activity Intent SerializableExtra 变为空,有什么想法吗?
- php - 显示来自其他域的内容而不使用 .htaccess 文件更改 url
- sql - 如何更新具有多列条件的表?