我试图将霍华德·欣南特先生的库中的date::year_month_day
转换为std::chrono::system_clock::time_point
,但没有成功。最终,我想从UTC时区的时间点计算time_since_epoch().count()
。
我下面的代码可以完成这项工作(结果是在我的本地时区),但如果它提供这样的功能,我更愿意使用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
字符串
1条答案
按热度按时间sgtfey8w1#
我注意到你使用的是Windows。最近版本的MSVC附带了C20
<chrono>
的完整实现。这使我的日期库过时了。我的建议是使用C20<chrono>
。虽然由于某种原因你不能,我很乐意帮助。你的第一次尝试是正确的。但出于某种原因,它似乎不正确:
字符串
Windows
system_clock::time_point
以1/10微秒(十进制微秒)为单位计数。其中1699488000000000的刻度是2023-11-09 00:00:00.0000000 UTC。从您的注解中可以看出,您似乎将1699488000000000解释为纳秒计数而不是十进制微秒。如果您显示解释1699488000000000的代码,则会有所帮助。虽然你的代码是正确的,但它也过于冗长。在功能不变的情况下,它可以简化为:
型
类型
sys_days
是time_point<system_clock, days>
的类型别名,因此您实际上插入了一个免费的复制构造。如果你想把结果作为纳秒的计数,这也很容易做到:
型
现在
tp.time_since_epoch().count()
是16994880000000000(最后多了两个零)。