我在用霍华德·辛南特的时区图书馆。
https://howardhinnant.github.io/date/tz.html
我的问题:是否可以从一个std::chrono::time_point构造一个date::local_time对象?
我想:
// 'tp' exists and is some std::chrono::time_point object
auto locTime = date::local_time<std::chrono::milliseconds>(tp);
这个函数的构造函数不存在,所以会出现编译错误。我该怎么做(用简洁的C++17)?
背景:我的最终目标是比较std::filesystem::file_time_type
和date::local_time<std::chrono::milliseconds>
。
我知道auto fileTimeTp = std::chrono::clock_cast<std::chrono::system_clock>(someDirectoryEntryObject.last_write_time());
这给了我的文件日期的std::chrono::time_point,但这就是我被卡住的地方...
1条答案
按热度按时间nukf8bse1#
答案分为两部分......
第1部分
我的问题:是否可以从
std::chrono::time_point
构造date::local_time对象?我将假设
std::chrono::time_point
引用std::chrono::system_clock::time_point
(每个时钟都有自己的std::chrono::time_point
系列)。是的,这是可能的。
system_clock::time_point
被定义为Unix Time,它非常接近UTC。因此,要从system_clock::time_point
(在日期库/C ++20中也称为sys_time
)转到local_time
,您需要将sys_time
与time_zone
配对。这可能是您计算机的当前本地时区,或任何其他IANA time zone。要获取计算机当前的本地时区:
tz
的类型是date::time_zone const*
。time_zone
有一个名为to_local
的成员函数,它将把sys_time
转换为local_time
:无论输入
sys_time
的精度是多少,locTime
的精度都将匹配。如果您希望使用其他时区,则可以使用
date::locate_zone
来获取到 * 该 * 时区的date::time_zone const*
。第2部分
我的最终目标是将
std::filesystem::file_time_type
与date::local_time<std::chrono::milliseconds>
进行比较。啊,这根本不会涉及到
local_time
,而且不幸的是,file_clock
并没有在the time_zone library中实现。在C++20中,这将是相当容易的:给定
file_time
和sys_time
,可以使用clock_cast
将其中一个转换为另一个:然而在C++17中它更难,而且不可移植。the time_zone library使它更容易,但并不容易。
首先必须推导出
std::filesystem::file_time_type
在您的平台上的纪元,这将根据您使用的std::filesystem::file_time_type
的实现而有所不同。现有时期包括:
然后减去
sys_time
时期(sys_days{1970_y/1/1}
)和file_time
时期(例如sys_days{1601_y/1/1}
),并加上/减去该时期以从一种测量转换为另一种测量。例如:
不幸的是,这相当混乱,我期待着
clock_cast
在C++20中与file_clock
一起工作。