C ++将NTP服务器返回的时间转换为字符串

时间:2019-05-17 14:14:53

标签: c++

我是C ++的新手,并且想要将NTP服务器的纪元值转换为人类可读的日期时间值。

void printTime() {
  /*
  Human time (GMT): Friday, May 17, 2019 8:44:16 AM
  Human time (your time zone): Friday, May 17, 2019 10:44:16 AM GMT+02:00
  */
  unsigned long e = 1558082656;
  time_t epoch = e;
  struct tm *timeinfo_e;
  char buf[80];

  time(&epoch);
  timeinfo_e = gmtime(&epoch);
  std::cout << "epoch: " << asctime(timeinfo_e) << std::endl;
  strftime(buf, sizeof(buf), "%a %Y-%m-%d %H:%M:%S %Z", timeinfo_e);
  printf("%s\n", buf);
}

但它显示当前时间,而不是那个纪元值的时间。 有什么问题吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

time(&epoch);

这会将当前时间存储到epoch中,从而覆盖您先前分配的值。如果您将其取出,程序将显示您分配给epoch的UNIX时间。

但是,C ++带有其自己的日期时间库,并且计划将其设置为vastly improved come C++20,在那里它应该能够完全避免使用C API。到今天为止,您已经可以看到我所说的对理解代码的改进:

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

namespace chr = std::chrono;

void printTime() {
  using Clock = chr::system_clock;
  unsigned long e = 1558082656;

  chr::time_point<Clock> time(chr::seconds{e});
  auto c_time = Clock::to_time_t(time); // Gone if using C++20's to_stream function
  std::cout << std::put_time(std::gmtime(&c_time), "%c %Z"); // localtime for the user's timezone
}

如果您感觉到time_point到现在有点回旋,尽管已明确指示自时钟纪元以来的秒数,那么put_time仍然是一种更方便的打印方式C次。