我正在编写一个具有以下代码的跨平台应用程序:
auto last_write_file_time = std::filesystem::last_write_time(in_file_name);
time_t tt = std::chrono::system_clock::to_time_t(last_write_file_time);
tm tast_write_file_time_in_tm = *std::localtime(&tt);
在本节中,我得到了结构中文件的最后修改时间tm。
将此部分转移到另一个平台时会出现问题。该函数std::filesystem::last_write_time返回带有一些预定义参数file_time_type的别名。std::chrono::time_point但是这个参数从编译器到编译器会发生变化,因此,如果在 gcc 中我可以毫无问题地将对象last_write_file_time传递给函数,那么 MSVC 由于类型不匹配而不再编译它。std::chrono::system_clock::to_time_t有没有办法将std::chrono::time_point一种类型转换为另一种类型?(例如,从std::chrono::time_point <system_clock>do std::chrono::time_point <steady_clock>)。
我尝试实现不同的选项来解决问题,最后我给出了一种方法,可能不是最短的,但我在 Windows / Linux 下的 MSVC / GCC / CLang 编译器上有它,它适用于每个人。
static int64_t sfclock_diff...转换本身包括两行以and开头的代码std::time_t cftime = ...,即 输入是ftime(调用结果std::filesystem::last_write_time(...)),输出cftime是类型time_t(后者将包含一个 Unix 时间戳,即从 开始的秒数1970-01-01 00:00:00)。之后,这些行仅用于信息目的,将时间到控制台的输出转换为系统的本地时间。
在线尝试!
结论: