【问题标题】:Can I avoid going through time_t to print a time_point?我可以避免通过 time_t 打印 time_point 吗?
【发布时间】:2018-12-29 19:18:16
【问题描述】:

这是一个例子adapted from cppreference.com

#include <iostream>
#include <iomanip>
#include <ctime>
#include <chrono>

int main() {
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    std::time_t now_c = std::chrono::system_clock::to_time_t(now);
    std::cout << "The time was just "
              << std::put_time(std::localtime(&now_c), "%F %T") << '\n';
}

我不喜欢这个。我想打印我的时间点而不必经过time_t。我可以这样做吗...:

  1. 有吗?
  2. put_time 这样的任意格式支持吗?

注意事项:

  • 标准库解决方案是最好的;非标准但稳健的解决方案也很重要。
  • 不是this 的骗子——因为我也对任意格式打印感兴趣;但应该注意的是,@HowardHinnant 对此的回答解决了这一问题的第一部分。

【问题讨论】:

  • @inf:说真的,你在标记为骗子之前阅读了这两个问题吗?现在,该问题的其中一个答案确实也回答了这个问题,但您不会通过阅读问题或大多数答案来知道这一点。
  • 那么一切都好吗?
  • @inf:不,看我的第一个答案。
  • 我重新打开了这个答案。前面提到的欺骗没有“不经过time_t 子句,这很重要,因为通过time_t 的行程丢失了小数秒信息。
  • @inf: 1. 寻找我问题答案的人不太可能/不太可能找到另一个问题 + 认为答案可以解决他们的问题 + 搜索所有内容 + 跟随链接查看那里的信息是否解决了他们的问题。有多个高度投票的问题对符合您的欺骗标准。 2.关于你的第二点 - 很公平,但即使我说过“仅标准解决方案”,仍然值得用“标准库中没有解决方案直到 C++17”来回答这部分问题。

标签: c++ c++11 c++-standard-library chrono time-t


【解决方案1】:

Howard Hinnant's library - 已被投票成为 C++20 的一部分 - 也支持类似 put_time 的格式。

#include "date/date.h"
#include <iostream>

int
main()
{
    std::cout << date::format("%m/%d/%Y %I:%M:%S %p\n", std::chrono::system_clock::now());
}

示例输出:

07/22/2018 03:30:35.001865 AM

【讨论】:

    【解决方案2】:

    由于@inf 的建议,在this answer 中找到了一个不允许您选择打印格式或时区的部分解决方案:您可以简单地将时间点通过管道传输到标准输出以获得UTC 时间戳字符串它:

    std::cout << std::chrono::system_clock::now() << " UTC\n";
    

    但对于任意格式,问题仍然存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多