将从epoch到yy-dd-hh-ss格式的时间以毫秒为单位转换



我有一堆以微秒为顺序的任务,下面的代码只打印到秒(星期四10月21日12:48:20 2021),所以比较开始和结束的值总是最终给出0。我希望能够以毫秒和微秒的顺序进行比较。有一个功能来帮助这个吗?

还有,是否有办法将uint64_t current1 = std::chrono::system_clock::now().time_since_epoch().count();转换为time_t,以基于count()打印当前时间?

const auto p1 = std::chrono::system_clock::now();
std::time_t now = std::chrono::system_clock::to_time_t(p1);
std::cout << "now: " << std::ctime(&now);

我建议完全跳过C计时API。它容易出错,不能处理亚秒级精度。

如果UTC(相对于本地时间)是可以的,那么有一个仅头文件的c++ 20的开源预览版,可以与c++ 11/14/17一起工作:

#include "date/date.h"
#include <chrono>
#include <iostream>
int
main()
{
using date::operator<<;
const auto p1 = std::chrono::system_clock::now();
std::cout << "now: " << p1 << 'n';
}

输出:

now: 2021-10-21 20:28:15.754423

要将上述程序移植到c++ 20(它已经在最新的Visual Studio中发布),只需删除#include "date/date.h"using date::operator<<;

如果你需要本地时间,c++ 20也可以提供(在VS中发布),但是c++ 20的开源预览版不再只有头文件。存在一个需要编译的源文件,并且根据您的需要,可能需要下载IANA tz数据库。

#include "date/tz.h"
#include <chrono>
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
const auto p1 = system_clock::now();
std::cout << "now: " << zoned_time{current_zone(), p1} << 'n';
}

输出:

now: 2021-10-21 16:28:15.754423 EDT

以上语法假定为c++ 17。对于c++ 11/14,需要指定zoned_time的模板参数:zoned_time<system_clock::duration>.

上面的程序通过去掉#include "date/tz.h"using namespace date;来移植到c++ 20。

在任何程序中,都可以使用以下命令截断到毫秒级精度:

const auto p1 = floor<milliseconds>(system_clock::now());

time_t通常是指定(整)秒的整数。

您可以通过从now中减去整秒time_t来获得毫秒数:

auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
p1 - std::chrono::system_clock::from_time_t(now)).count();

或使用operator%:

auto ms = std::chrono::time_point_cast<std::chrono::milliseconds>p1)
.time_since_epoch() % std::chrono::seconds(1);
std::cout << ms.count();

示例:

#include <chrono>
#include <iostream>
#include <iomanip>
int main() {
using Clock = std::chrono::system_clock;
using Precision = std::chrono::milliseconds;
auto time_point = Clock::now();
// extract std::time_t from time_point
std::time_t t = Clock::to_time_t(time_point);
// output the part supported by std::tm
std::cout << std::put_time(std::localtime(&t), "%FT%T."); // select format here
// get duration since epoch
auto dur = time_point.time_since_epoch();
// extract the sub second part from the duration since epoch
auto ss =
std::chrono::duration_cast<Precision>(dur) % std::chrono::seconds{1};
// output the millisecond part
std::cout << std::setfill('0') << std::setw(3) << ss.count();
}

最新更新