【发布时间】:2020-10-24 18:56:39
【问题描述】:
我有两个 UTC 时间,存储为“天:小时:分钟:秒:毫秒”,还有五个整数变量表示天、小时、分钟等。我想找出这两个时间之间的差异, 以毫秒为精度。在 C++ 中如何做到这一点?
【问题讨论】:
-
你能指定“天”部分是如何表示的吗?如果只是增量天数,那么显而易见的方法就是将所有内容相乘以获得总毫秒数。
我有两个 UTC 时间,存储为“天:小时:分钟:秒:毫秒”,还有五个整数变量表示天、小时、分钟等。我想找出这两个时间之间的差异, 以毫秒为精度。在 C++ 中如何做到这一点?
【问题讨论】:
如何计算精确的时差 (C++)?
在 Linux 上,阅读time(7) 并点击那里的超链接。要使用 C 解析时间,请使用 strptime(3)。要将其转换并格式化为字符串,请使用strftime(3)。两者都可以从 C++ 代码中调用(使用extern "C")。
原来的问题被标记为 C 和 C++
对于 C,请阅读 Modern C 书籍,对于 Linux,请阅读 Advanced Linux Programming 然后 syscalls(2)。
对于 C++,请阅读 Programming in C++。
<chrono> standard header。该标头中的类和函数使您能够计算该差异。
使用GCC 编译代码时,启用所有警告和调试信息。所以使用gcc 或g++ with -Wall -Wextra -g 并学会使用GDB。
在 Linux 上,您会发现有用的 open source 库,例如 Glib、POCO、Qt、GtkMM 以及像 JSON 或 SWIG 这样的工具......
请查看github 或gitlab 获取一些可以激发您灵感的源代码。
我想找出这两次之间的差异,精确到毫秒。
这可能很困难。您的硬件可能没有毫秒精度。如果是联网的,可以考虑使用一些NTP服务。如果未连接,预计时钟会在几周内漂移超过一毫秒,除非您采取非常具体的预防措施或购买昂贵的硬件。
【讨论】:
以毫秒精度计算时间差:
将两个时间戳都转换为std::chrono::system_clock::time_point。
struct std::tm thetime { .tm_sec = sec, .tm_min = min, .tm_hour = hour,
.tm_mday = mday, .tm_mon = mon, .tm_year = year };
auto mytime = (std::chrono::system_clock::from_time_t(std::mktime(&thetime)))
+ std::chrono::milliseconds(msec);
减去两个生成的时间戳。
auto diffms = std::chrono::duration_cast<std::chrono::milliseconds(mytime2 - mytime1).count();
编辑:这不考虑闰秒或夏令时。如果您对毫秒感兴趣,您可能应该使用两者都没有的时间尺度(因此本地时间和 UTC 都不是好的选择)。如果您的日期和时间首先来自“UTC”POSIX 时钟,那么您可能会很好,因为“UTC”POSIX 时钟不考虑闰秒(当然也没有 DST)。
【讨论】:
from_time_t 的文档是如何暗示的?