c++ - 使用 VC141 将 high_resolution_clock::time_point 转换为 time_t
问题描述
在 Visual Studio 2013 中,我刚刚使用
#include <chrono>
#include <ctime>
#include <iostream>
#include <iomanip>
#include <sstream>
std::string Time_Point_String(const std::chrono::high_resolution_clock::time_point & timePoint)
{
time_t timeNow = std::chrono::system_clock::to_time_t(timePoint);
tm time = *localtime(&timeNow);
std::stringstream timeString;
timeString << std::setfill('0') << 1900 + time.tm_year << "-" << std::setw(2) << time.tm_mon + 1 << "-" << std::setw(2) << time.tm_mday << " " << std::setw(2) << time.tm_hour << ":" << std::setw(2) << time.tm_min << ":" << std::setw(2) << time.tm_sec;
return timeString.str();
}
int main()
{
const std::chrono::high_resolution_clock::time_point & timePoint = std::chrono::high_resolution_clock::now();
std::cout << Time_Point_String(timePoint);
return 0;
}
但在 Visual Studio 2017 中,我得到一个编译器错误:
错误 C2664 '__time64_t std::chrono::system_clock::to_time_t(const std::chrono::system_clock::time_point &) noexcept':无法将参数 1 从 'const std::chrono::steady_clock::time_point' 转换为'const std::chrono::system_clock::time_point &'
所以不可能再将 a 转换high_resolution_clock::time_point
为不同的time_point
likesystem_clock::time_point
并且不可能直接转换high_resolution_clock::time_point
为time_t
?
我该如何处理这种情况?有没有可能(一些SO帖子说它们只是完全不同的时钟,转换没有意义)?据我所见,该函数完成了我在 Visual Studio 2013 应用程序中的预期,它为高分辨率 time_point 提供了正确的本地时间。
解决方案
这是因为它std::chrono::high_resolution_clock
是 std::chrono::system_clock
or的类型别名std::chrono::steady_clock
:
Class
std::chrono::high_resolution_clock
表示实现提供的具有最小滴答周期的时钟。它可能是 或 的别名,std::chrono::system_clock
或者std::chrono::steady_clock
是第三个独立时钟。
这意味着std::chrono::high_resolution_clock::time_point
可以是 的类型别名std::chrono::system_clock::time_point
,也可以是其他类型。根据您的问题,可以猜测它适用于 MSVC2013,使您的代码有效,但不适用于 MSVC2017,使您的代码无效。
作为结论,以下代码可能有效也可能无效,以未指定的方式(它取决于编译器及其目标架构):
std::chrono::high_resolution_clock::time_point timePoint = /* something */;
std::chrono::system_clock::to_time_t(timePoint);
推荐阅读
- php - Symfony 2.8 和 3.4 中事件调度和处理的区别?
- javascript - 让 Angularjs 重新附加一个 DOM 节点而不是更新它
- python - 如何在不通过 kubectl 的情况下上传 Airflow dags(工作流)?
- python-3.x - Python 3 使用 24 位 (HTML5) rgb 代码打印文本
- c# - Dapper 多重映射
- node.js - 节点:multer更改字段的目标文件夹
- winapi - 仅当动态卸载 DLL 时,DLL 才应释放堆内存?
- android - 为什么我的新 Admob 单元没有任何广告?
- ios - UINavigationBar - 更改标题颜色
- c - CoreAudio Input Render 回调从外部音频接口 Mac OS 10.14 Mojave 渲染所有 0