Visual Studio 2022上的C++ last_write_time返回巨大的数字[重复]

8yparm6h  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(162)

此问题在此处已有答案

What are the reference epoch dates (and times) for various platforms and languages?(2个答案)
5天前关闭。
我正在写一个简单的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;
}
j7dteeu8

j7dteeu81#

last_write_time的返回值是一个time_point,它使用file_clock时钟作为其时间的基础。此时钟可能 * 也可能 * 与任何其他时钟具有相同的历元。历元由实现定义。
因此,程式码的行为会随着实作而变更。
如果你想得到一个文件相对于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

相关问题