【问题标题】:How can I calculate a precise time difference (C++)?如何计算精确的时差(C++)?
【发布时间】:2020-10-24 18:56:39
【问题描述】:

我有两个 UTC 时间,存储为“天:小时:分钟:秒:毫秒”,还有五个整数变量表示天、小时、分钟等。我想找出这两个时间之间的差异, 以毫秒为精度。在 C++ 中如何做到这一点?

【问题讨论】:

  • 你能指定“天”部分是如何表示的吗?如果只是增量天数,那么显而易见的方法就是将所有内容相乘以获得总毫秒数。

标签: c++ linux datetime time


【解决方案1】:

如何计算精确的时差 (C++)?

在 Linux 上,阅读time(7) 并点击那里的超链接。要使用 C 解析时间,请使用 strptime(3)。要将其转换并格式化为字符串,请使用strftime(3)。两者都可以从 C++ 代码中调用(使用extern "C")。

C 和 C++ 是不同的语言。另见this

原来的问题被标记为 C 和 C++

对于 C,请阅读 Modern C 书籍,对于 Linux,请阅读 Advanced Linux Programming 然后 syscalls(2)

对于 C++,请阅读 Programming in C++

您可以使用<chrono> standard header

该标头中的类和函数使您能够计算该差异。

使用GCC 编译代码时,启用所有警告和调试信息。所以使用gccg++ with -Wall -Wextra -g 并学会使用GDB

在 Linux 上,您会发现有用的 open source 库,例如 GlibPOCOQtGtkMM 以及像 JSONSWIG 这样的工具......

请查看githubgitlab 获取一些可以激发您灵感的源代码。

我想找出这两次之间的差异,精确到毫秒。

这可能很困难。您的硬件可能没有毫秒精度。如果是联网的,可以考虑使用一些NTP服务。如果未连接,预计时钟会在几周内漂移超过一毫秒,除非您采取非常具体的预防措施或购买昂贵的硬件。

【讨论】:

  • 您的回答几乎没有解决实际问题。你谈论 Unix 特定的时间函数(没有真正解释它们与问题的关系)、C++ 书籍和编译器、开源库和 NTP。问题是关于 C++ 中两个 UTC 时间戳的时差。这当然是一些有用的链接,但对于试图解决原始问题的人来说并没有太大的直接好处。
【解决方案2】:

以毫秒精度计算时间差:

  1. 将两个时间戳都转换为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);
    
  2. 减去两个生成的时间戳。

     auto diffms = std::chrono::duration_cast<std::chrono::milliseconds(mytime2 - mytime1).count();
    

编辑:这不考虑闰秒或夏令时。如果您对毫秒感兴趣,您可能应该使用两者都没有的时间尺度(因此本地时间和 UTC 都不是好的选择)。如果您的日期和时间首先来自“UTC”POSIX 时钟,那么您可能会很好,因为“UTC”POSIX 时钟不考虑闰秒(当然也没有 DST)。

【讨论】:

  • 请注意,此方法不考虑闰年、闰秒和其他日历诡计,因此对于与任何此类好奇心重叠的时间跨度,它可能会产生意想不到的结果。
  • @ComicSansMS 你为什么这么认为? from_time_t 的文档是如何暗示的?
  • 再想一想,我实际上并不确定闰年会发生什么,这可能是我的大脑放屁,所以对此表示歉意。虽然肯定没有处理闰秒,但这是由于 Posix 如何定义系统时钟和 C++ adopts that same behavior。有关完整的混乱故事,请参阅one of Howard Hinnant's many brilliant answers on this topic。我同意许多应用程序不会关心这一点,但您最好在复制粘贴之前确保您的应用程序不关心。
  • @ComicSansMS 闰年肯定有效,但闰秒和 DST 确实可能会也可能不会。 (如果你计算毫秒,你可能不应该使用其中任何一个)
猜你喜欢
  • 2020-12-24
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 2018-12-20
相关资源
最近更新 更多