AFP*_*AFP 2 c++ datetime c++-chrono
我正在尝试将date::year_month_dayHoward Hinnant 先生的图书馆转换为std::chrono::system_clock::time_point,但没有成功。最终,我想time_since_epoch().count()从UTC时区的时间点开始计算。
我下面的代码可以完成这项工作(结果是在我当地的时区),但如果它提供此类功能,我最好使用date库来实现此目的。
date::year_month_day _ymd = date::year{2023}/11/9; // November 9, 2023
// Modern C++
// The following returns 16994880000000000
// = Thursday, July 16, 1970 4:48:00 PM, which is not 2023/11/09
std::chrono::system_clock::time_point tp =
std::chrono::time_point<std::chrono::system_clock, std::chrono::days>(std::chrono::sys_days{_ymd});
// Classic C++
// The following returns 1702108800
// = Saturday, December 9, 2023 8:00:00 AM, which of course is not 2023/11/09
struct tm t = {0};
t.tm_year = _ymd.year().operator int() - 1900;
t.tm_mon = _ymd.month().operator unsigned int();
t.tm_mday = _ymd.day().operator unsigned int();
time_t timeSinceEpoch = mktime(&t);
std::cout << "timeSinceEpoch " << timeSinceEpoch << "\n"; // it will be in my time zone, not UTC
Run Code Online (Sandbox Code Playgroud)
我注意到您使用的是 Windows。MSVC 的最新版本附带了 C++20 的完整实现<chrono>。这使我的日期库过时了。我的建议是使用 C++20 <chrono>。如果由于某种原因你不能,我很乐意提供帮助。
你的第一次尝试是正确的。但由于某种原因,这对你来说似乎是不正确的:
date::year_month_day _ymd = date::year{2023}/11/9; // November 9, 2023
// Modern C++
// The following returns 16994880000000000
// = Thursday, July 16, 1970 4:48:00 PM, which is not 2023/11/09
std::chrono::system_clock::time_point tp =
std::chrono::time_point<std::chrono::system_clock, std::chrono::days>(std::chrono::sys_days{_ymd});
Run Code Online (Sandbox Code Playgroud)
Windowssystem_clock::time_point以 1/10 微秒(十微秒)为单位进行计数。其中 16994880000000000 个刻度是 2023-11-09 00:00:00.0000000 UTC。从您的评论来看,您似乎将 16994880000000000 解释为纳秒计数而不是十分之一微秒。如果您显示为您解释 16994880000000000 的代码,将会有所帮助。
尽管您的代码是正确的,但它也过于冗长。在功能不变的情况下,它可以简化为:
std::chrono::system_clock::time_point tp = std::chrono::sys_days{_ymd};
Run Code Online (Sandbox Code Playgroud)
该类型sys_days是 的类型别名time_point<system_clock, days>。所以你实际上只是插入了一个无偿的复制结构。
如果您想要以纳秒计数的结果,这也很容易完成:
std::chrono::sys_time<std::chrono::nanoseconds> tp = std::chrono::sys_days{_ymd};
Run Code Online (Sandbox Code Playgroud)
现在tp.time_since_epoch().count()是 1699488000000000000(末尾多了两个零)。
| 归档时间: |
|
| 查看次数: |
386 次 |
| 最近记录: |