web-dev-qa-db-ja.com

std :: filesystem :: file_time_typeをtime_tに変換する方法

以下のコードがSTD :: FILESYSTEM :: LAST_WRITE_TIME結果time_tを変換するMSVC2015を使用してWindowsのソリューションを書きました。

time_t ftime = std::file_time_type::clock::to_time_t(fs::last_write_time("/Path/filename"))
 _

うまく機能します。その後、GCC 9.3を使用してLinuxへのソリューションを移植しようとしたとき(-std = C++ 2A)フォローエラーが発生しました。

エラー: 'to_time_t'は 'std :: chrono :: time_point :: clock' {AKA 'std :: filesystem :: __ file_clock'}のメンバーではありません。

私は解決策を検索しました、しかし私が見つけたことはstd :: filesystem :: last_write_time at cplusplus.com の例に含まれるソリューションに基づいています。解決策は以下のとおりです。

auto ftime = fs::last_write_time(p);
std::time_t cftime = decltype(ftime)::clock::to_time_t(ftime);
 _

残念ながらそれは私には機能しません。実際には、この例では、MSVC(MSVC2015)またはGCC 9で動作しないと言っているコメントがあります。 C++ 20はポータブル出力を可能にします。

今、私は立ち往生しています... GCCを使ってこの変換をするにはどうすればよいですか?

6
TheArchitect

これは質問に対する直接的な答えではなく、多分携帯用の解決策ではありませんが、std :: filesystem :: file_time_typeへの変換の問題がありますstd :: chrono: :system_clock :: time_point(それは簡単にtime_tに変換することができます)2017年にこれが私のために働いていて、検索にもある人の他の人に役立ちます...

using namespace std::chrono;

// a dummy file_time_type to work with
const auto ftp = std::filesystem::file_time_type::clock::now();

// get the ticks and subtract the file time Epoch adjustment
const auto ticks = ftp.time_since_Epoch().count() - __std_fs_file_time_Epoch_adjustment;

// create a time_point from ticks
const auto tp = system_clock::time_point(system_clock::time_point::duration(ticks));

// finaly convert to time_t
std::time_t tt = system_clock::time_point::clock::to_time_t(tp);
 _
0
redleg