【问题标题】:How can I create an std::chrono::time_point for 1 Jan 1970 00:00:00?如何为 1970 年 1 月 1 日 00:00:00 创建 std::chrono::time_point?
【发布时间】:2016-11-04 11:48:54
【问题描述】:

是否有一种可移植的符合标准的方法来为 1970 年 1 月 1 日 00:00:00 创建 std::chrono::time_point?这必须是线程安全的。因此,解决方案应避免使用没有线程安全保证的std::gmtime()std::localtime() 之类的函数。

这不是Convert std::chrono::time_point to unix timestamp 的重复,因为我要求的是线程安全便携式 解决方案。那里的问题也没有要求,答案也没有提供这种保证。

【问题讨论】:

  • 这听起来像是两个问题,1)如何创建特定时间点 - 没有线程问题,2)如何获取当前时间 - 潜在的线程问题。
  • 当心。 Posix 标准没有定义“纪元”,然后依靠“秒”和“以来”的正常含义。它定义了完整的短语“自纪元以来的秒数”,这并不意味着您可能已经认为它的意思。
  • @CaptainGiraffe 这不是重复的,因为我要求的是可移植且线程安全的解决方案。那里的问题不要求这个,答案也不提供这些保证。
  • 如果我能得到这个:open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0355r1.html 标准化,那么默认构造的std::chrono::time_point{} 将可移植地表示 1970-01-01 00:00:00 UTC。它将是线程安全和闪电般快速的(需要存储 64 位零)。

标签: c++ time chrono


【解决方案1】:

实际上,std::chrono::system_clock::from_time_t(0) 将返回您想要的值。

原则上,我看不出你想要什么。

或者,在多个线程开始运行之前计算一次(在启动时)该值。

【讨论】:

  • 短语实践中听起来不太便携。事实上,std::time_t 的类型并没有在标准中明确定义。
  • 我同意 std::time_t 的类型未定义。 在实践中,我的意思是“我不知道有任何当前的实现方法不起作用”。这可能会让您对非 Posix 的嵌入式系统感到悲痛(但小型系统往往是用 C 而不是 C++ 编程),而且我不了解 IBM 操作系统(AIX 会很好)。
  • 请注意,std::time_t 定义为算术运算,因此文字零将毫无困难地转换为它。
  • 实际上,我发现传递mktime(&tm) 而不是0 应该可以工作,其中tm 的类型为std::tm,并设置了相应的字段。
  • 太棒了!我认为这是一个合适的答案。
猜你喜欢
  • 2013-05-31
  • 2012-02-19
  • 2016-12-27
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
相关资源
最近更新 更多