我正在编写一个简单的c++20程序来获取文件的最后修改时间。在MacOS上,它工作得很好,并以秒为单位返回昨天修改的文件的Unix纪元时间。然而,在Windows与Visual Studio 2022上,下面的代码返回Got Modified Time of: 13314844775
,根据Unix时间戳工具这里是未来的369年。如何正确转换?
#include <iostream>
#include <filesystem>
#include <chrono>
int main()
{
std::string fileName = "test.txt";
auto modTime = std::filesystem::last_write_time(std::filesystem::path(fileName));
auto epoch = modTime.time_since_epoch();
auto converted = std::chrono::duration_cast<std::chrono::seconds>(epoch);
auto counts = converted.count();
std::cout << "Got Modified Time of: " << counts << std::endl;
}
last_write_time
的返回值是一个以file_clock
时钟为基准的time_point
。这个时钟可以,也可以不与任何其他时钟具有相同的历元。epoch是由实现定义的。
因此,代码的行为随着实现而改变。
如果您想获得一个文件相对于UNIX时间的时间,您需要c++ 20,它添加了clock_cast
功能。这允许您将时间点转换为相对于不同时钟的时间点。所以你可以这样做:
auto modTime = std::filesystem::last_write_time(std::filesystem::path(fileName));
auto modTimeUnix = std::chrono::clock_cast<std::chrono::system_clock>(modTime);
在c++ 20中,要求system_clock
在所有实现中都是UNIX时间,并且要求file_clock
能够转换为system_clock
。