c++ 如何根据标准时间点生成日期::本地时间

ntjbwcob  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(124)

我在用霍华德·辛南特的时区图书馆。
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_typedate::local_time<std::chrono::milliseconds>
我知道
auto fileTimeTp = std::chrono::clock_cast<std::chrono::system_clock>(someDirectoryEntryObject.last_write_time());
这给了我的文件日期的std::chrono::time_point,但这就是我被卡住的地方...

nukf8bse

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_timetime_zone配对。这可能是您计算机的当前本地时区,或任何其他IANA time zone
要获取计算机当前的本地时区:

auto tz = date::current_zone();

tz的类型是date::time_zone const*time_zone有一个名为to_local的成员函数,它将把sys_time转换为local_time

auto locTime = tz->to_local(system_clock::now());

无论输入sys_time的精度是多少,locTime的精度都将匹配。
如果您希望使用其他时区,则可以使用date::locate_zone来获取到 * 该 * 时区的date::time_zone const*

auto locTime = date::locate_zone("America/New_York")->to_local(system_clock::now());

第2部分

我的最终目标是将std::filesystem::file_time_typedate::local_time<std::chrono::milliseconds>进行比较。
啊,这根本不会涉及到local_time,而且不幸的是,file_clock并没有在the time_zone library中实现。
在C++20中,这将是相当容易的:给定file_timesys_time,可以使用clock_cast将其中一个转换为另一个:

if (clock_cast<system_clock>(ftp) >= system_clock::now())
    ...

然而在C++17中它更难,而且不可移植。the time_zone library使它更容易,但并不容易。
首先必须推导出std::filesystem::file_time_type在您的平台上的纪元,这将根据您使用的std::filesystem::file_time_type的实现而有所不同。
现有时期包括:

* 1970-01-01 00:00:00 UTC
* 1601-01-01 00:00:00 UTC
* 2174-01-01 00:00:00 UTC

然后减去sys_time时期(sys_days{1970_y/1/1})和file_time时期(例如sys_days{1601_y/1/1}),并加上/减去该时期以从一种测量转换为另一种测量。
例如:

constexpr auto diff = sys_days{1970_y/1/1} - sys_days{1601_y/1/1};
file_time_type ftp = ...
system_clock::time_point tp{ftp.time_since_epoch() - diff};

不幸的是,这相当混乱,我期待着clock_cast在C++20中与file_clock一起工作。

相关问题