![](/img/trans.png)
[英]How to retrieve the clock type of std::filesystem::file_time_type in C++17
[英]Lost about std::filesystem's clock conversions, in C++17 lacking clock_cast
不久前,我设法做到了,从文件系统到系统时钟到 go,这要归功于 SO:
int64_t toUSsecSinceEpochUTC(std::filesystem::file_time_type ftime) {
// see https://stackoverflow.com/a/35282833/103724
using namespace std::chrono;
auto sys_now = system_clock::now();
auto fil_now = decltype(ftime)::clock::now(); // i.e. C++20's file_clock
auto sys_ftime = time_point_cast<system_clock::duration>(ftime - fil_now + sys_now);
auto sys_ftime_usec = time_point_cast<microseconds>(sys_ftime);
return sys_ftime_usec.time_since_epoch().count();
}
但现在我想做相反的事情,我正在挣扎......这是我微弱的尝试:
std::filesystem::file_time_type fromUSsecSinceEpochUTC(int64_t usec_utc) {
std::filesystem::file_time_type ftime;
using namespace std::chrono;
auto sys_now = system_clock::now();
auto fil_now = decltype(ftime)::clock::now(); // i.e. C++20's file_clock
std::chrono::microseconds usec(usec_utc);
ftime = ????
return ftime;
}
MSVC2019 抱怨auto res = sys_now - usec + fil_now;
和
error C2676: binary '+': 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>' does not define this operator or a conversion to a type acceptable to the predefined operator
即稳定时钟和系统时钟之间的https://stackoverflow.com/a/35282833/103724中的代码似乎不适用于文件系统时钟。 虽然可能只是我没有跟随。
任何<chrono>
专家可以提供帮助吗?
要填写fromUSsecSinceEpochUTC
,您将:
std::filesystem::file_time_type
fromUSsecSinceEpochUTC(int64_t usec_utc) {
std::filesystem::file_time_type ftime;
using namespace std::chrono;
auto sys_now = system_clock::now();
auto fil_now = decltype(ftime)::clock::now(); // i.e. C++20's file_clock
microseconds usec(usec_utc);
time_point<system_clock, microseconds> tp_sys{usec};
return tp_sys - sys_now + fil_now;
}
话虽如此, system_clock
和file_clock
的时代之间的关系将是一个常数。 我相信 Windows file_clock
纪元是 1601-01-01 00:00:00 UTC。 这与system_clock
时期(1970-01-01 00:00:00 UTC)之间的差异是 13,4774 天或3'234'576h
。
这些知识使您无需调用now()
。
std::filesystem::file_time_type
to_file_time(std::chrono::system_clock::time_point sys_tp)
{
using namespace std::literals;
return std::filesystem::file_time_type{sys_tp.time_since_epoch() + 3'234'576h};
}
std::chrono::system_clock::time_point
to_sys_time(std::filesystem::file_time_type f_tp)
{
using namespace std::literals;
return std::chrono::system_clock::time_point{f_tp.time_since_epoch() - 3'234'576h};
}
上面我利用了先验知识,即file_clock::duration
::duration 与 Windows 上的system_clock::duration
类型相同。 根据需要或需要添加演员表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.