Я пишу простую программу на С++ 20, чтобы получить время последнего изменения файла. В MacOS он работает нормально и возвращает время эпохи Unix в секундах для файла, измененного только вчера. Однако в Windows с Visual Studio 2022 приведенный ниже код возвращает Got Modified Time of: 13314844775, что, согласно инструменту Unix Time Stamp Tool здесь, составляет 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;
}
@RaymondChen Грустно видеть, что этот элемент закрыт, потому что в указанном дубликате нет конкретного вопроса или кода. На сегодняшний день существует очень мало примеров clock_cast, и не ясно, что это лучший способ, потому что текущая версия Xcode даже не поддерживает его полностью.





Возвращаемое значение 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.
Эпоха Windows — 1 января 1601 года. Каковы даты (и время) эталонной эпохи для различных платформ и языков?