如何在当前时间的打印输出中获得更高的精度(几分之一秒)?

时间:2013-04-06 00:08:03

标签: c++ time

我尝试了几种方法来打印system_clock的时间,但除了整秒之外我什么都得不到:

system_clock::time_point now = system_clock::now();
std::time_t now_c = system_clock::to_time_t(now);

std::cout<<ctime(&now_c);
std::cout<<std::put_time(std::localtime(&now_c), "%T")<<" ";

now()函数实际上是否包含高精度数据,还是我找不到提取该信息进行打印的函数?

注意:我不打算计算时间间隔。我希望当前时间只有几分之一秒,并通过cout打印出来。我找不到办法做到这一点。

我知道std::chrono::high_resolution_clock,但也看不到打印now()。此外,setprecision函数对put_timectime的输出没有影响。

我一直在得到实际上没有解决这个问题的答案。

3 个答案:

答案 0 :(得分:7)

您可以执行以下操作:

#include <chrono>
#include <ctime>
#include <iostream>
#include <string>

std::string GetLocalTime() {
  auto now(std::chrono::system_clock::now());
  auto seconds_since_epoch(
      std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch()));

  // Construct time_t using 'seconds_since_epoch' rather than 'now' since it is
  // implementation-defined whether the value is rounded or truncated.
  std::time_t now_t(
      std::chrono::system_clock::to_time_t(
          std::chrono::system_clock::time_point(seconds_since_epoch)));

  char temp[10];
  if (!std::strftime(temp, 10, "%H:%M:%S.", std::localtime(&now_t)))
    return "";

  return std::string(temp) +
      std::to_string((now.time_since_epoch() - seconds_since_epoch).count());
}

int main() {
  std::cout << GetLocalTime() << '\n';
  return 0;
}

答案 1 :(得分:0)

现有答案很好,但是它错过了秒的小数部分的前导零,因此21:10:3​​0.01将返回为21:10:3​​0.1

我没有评论的代表,我的编辑被拒绝了,所以这是固定版本:

#include <chrono>
#include <ctime>
#include <iostream>
#include <string>

std::string GetLocalTime() {
  auto now(std::chrono::system_clock::now());
  auto seconds_since_epoch(
    std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch()));

  // Construct time_t using 'seconds_since_epoch' rather than 'now' since it is
  // implementation-defined whether the value is rounded or truncated.
  std::time_t now_t(
    std::chrono::system_clock::to_time_t(
      std::chrono::system_clock::time_point(seconds_since_epoch)));

  char temp[10];
  if (!std::strftime(temp, 10, "%H:%M:%S.", std::localtime(&now_t)))
    return "";

  std::string nanoseconds = std::to_string(
    (std::chrono::duration<long long, std::nano>(
      now.time_since_epoch() - seconds_since_epoch)).count());

  return std::string(temp) + std::string(9-nanoseconds.length(),'0') + nanoseconds;
}

int main() {
  std::cout << GetLocalTime() << '\n';
  return 0;
}

答案 2 :(得分:-2)

试试std::chrono::high_resolution_clock。 (我认为它只是c ++ 11)