【问题标题】:Get time since epoch in milliseconds, preferably using C++11 chrono以毫秒为单位获取自纪元以来的时间,最好使用 C++11 chrono
【发布时间】:2013-04-17 03:16:52
【问题描述】:

我想要的只是获取自纪元以来的时间(以毫秒为单位)并将其存储在无符号长整数中。

我找到了this related question。但老实说,这不可能是执行如此简单任务的最简单方法,不是吗?我希望有更简单的东西,但在std::chrono reference 中找不到任何东西。任何建议都是最受欢迎的。 我不一定非得使用std::chrono,但我希望它独立于平台。

【问题讨论】:

  • auto ms_since_epoch = duration_cast<milliseconds>(since_epoch); 看起来已经很简单了。也许问题出在chrono 的基本心态上,希望你能坚持类型安全和比unsigned long 更丰富的类型系统。
  • since_epoch 只是system_clock::now().time_since_epoch() 或您要转换的任何持续时间的替代变量。使用auto 并不意味着代码不是类型安全的。在这种情况下,我们显式声明了类型,我们只使用auto,所以我们不必重复它。
  • 但是计时持续时间的基本思路是类型为您跟踪单位,就像完整的物理单位库一样,您不必担心它,除非在边界进出chrono 的类型系统。例如考虑std::this_thread::sleep_for(microseconds(1000));std::this_thread::sleep_for(milliseconds(1));。库不关心输入的单位。两个持续时间代表相同的时间量,这就是最重要的。
  • @bames53,是的,原则上您对类型安全问题的权利。但是我真的不喜欢使用自动,特别是如果我不知道它会是什么类型。我并没有说 chrono 库没用,我完全同意它提供了很多不错的功能。困扰我的是,在我看来,微不足道的任务(比如这个)非常复杂。
  • @Haatschii 也许部分原因是这种事情应该是一种罕见的操作,只在边界上进行。理想情况下,无需将数据移出类型系统即可完成所有工作。这样不仅不需要使用count() 来获得无单位值,甚至不需要使用duration_cast;只需在计算中直接使用since_epoch

标签: c++ c++11 chrono


【解决方案1】:
unsigned long milliseconds_since_epoch =
    std::chrono::system_clock::now().time_since_epoch() / 
    std::chrono::milliseconds(1);

虽然,特别是因为您希望独立于平台,最好将unsigned long 替换为更可能足够大的类型:

  • (unsigned) long long
  • std::(u)int64_t
  • std::chrono::milliseconds::rep
  • auto

对我来说,这清楚地表明您正在冒着精度损失的风险(通过与整数除法类比)您正在离开类型系统的安全性(通过除以类型是时候给出一个无单位的数字了)。然而,正如 cmets 中所展示的那样,有些人会说,任何摆脱类型安全的尝试都应该伴随着故意使代码看起来很危险的尝试。如果您需要与持有这种信念的人打交道,使用duration_cast 可能会更简单,而不是就不相关的风格选择进行争论:

unsigned long milliseconds_since_epoch = 
    std::chrono::duration_cast<std::chrono::milliseconds>
        (std::chrono::system_clock::now().time_since_epoch()).count();

【讨论】:

  • @bames53:这取决于您所说的“简单”是什么意思。你所说的“是”是什么意思。但是,按照我的审美,感觉比duration_cast&lt;...&gt;(...).count()更有表现力,所以我把它作为替代品来呈现。
  • @MikeSeymour 我用这种方法看到的是将一个持续时间除以另一个持续时间,结果是一个无单位的值。在我看来,这似乎比保留维度的替代方案更具表现力。
  • @MikeSeymour “除法清楚地表明了潜在的舍入问题,这与整数除法完全相似”这是真的,但同时看起来你正在除以 '1' 而你需要知道发生了什么才能知道在这种情况下除以“1”是不安全的。 IMO 这绝对是一个比任何旧的整数除法更值得贴上“正在发生的事情”标签的案例。突破类型系统应该看起来就像突破类型系统。
  • 不幸的是,C++11 没有指定 system_clock 或任何其他时钟的纪元。 :-( 但见stackoverflow.com/questions/29799293/when-is-stdchrono-epoch.
  • 这个答案是不正确的,尽管适用于大多数实现。该标准没有指定时钟的纪元是什么。事实上,我的 GCC 5.3 mingw 版本使用系统启动时间作为一个纪元,它与 unix 纪元没有任何关系。
猜你喜欢
  • 2013-05-14
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 2011-04-30
  • 2019-12-04
  • 2012-02-23
  • 2017-01-19
相关资源
最近更新 更多