我是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);
}
但它显示当前时间,而不是那个纪元值的时间。 有什么问题吗?
谢谢!
答案 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次。