Как преобразовать `std :: filesystem :: file_time_type` в строку, используя GCC 9 - PullRequest
1 голос
/ 27 июня 2019

Я пытаюсь отформатировать время модификации файла в виде строки (UTC).Следующий код компилируется с GCC 8, но не с GCC 9.

#include <chrono>
#include <filesystem>
#include <iomanip>
#include <iostream>
#include <sstream>

namespace fs = std::filesystem;

int main() {
    fs::file_time_type file_time = fs::last_write_time(__FILE__);
    std::time_t tt = decltype(file_time)::clock::to_time_t(file_time);
    std::tm *gmt = std::gmtime(&tt);
    std::stringstream buffer;
    buffer << std::put_time(gmt, "%A, %d %B %Y %H:%M");
    std::string formattedFileTime = buffer.str();
    std::cout << formattedFileTime << '\n';
}

Я пробовал decltype(file_time)::clock и std::chrono::file_clock, используя C ++ 17 и C ++ 20, но ни один из них не работал.

$ g++-9 -std=c++2a -Wall -Wextra -lstdc++fs file_time_type.cpp

file_time_type.cpp: In function ‘int main()’:
file_time_type.cpp:12:50: error: ‘to_time_t’ is not a member of ‘std::chrono::time_point<std::filesystem::__file_clock>::clock’ {aka ‘std::filesystem::__file_clock’}
   12 |     std::time_t tt = decltype(file_time)::clock::to_time_t(file_time);
      |                                                  ^~~~~~~~~

В примере на https://en.cppreference.com/w/cpp/filesystem/file_time_type упоминается, что он не работает на GCC 9, потому что C ++ 20 позволит переносить вывод, но я понятия не имею, как заставить его работать.Разве это не должно работать с GCC 9, если я просто не использую C ++ 20?

Я бы предпочел решение C ++ 17 с GCC 9, если это возможно.

...