c++ on Visual Studio 2022 last_write_time返回巨大的数字 &



我正在编写一个简单的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

最新更新