【发布时间】:2019-06-27 10:09:17
【问题描述】:
我正在尝试将文件的修改时间格式化为字符串 (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 将允许可移植输出,但我不知道如何让它工作。如果我不使用 C++20,它不应该与 GCC 9 一起使用吗?
如果可能的话,我更喜欢使用 GCC 9 的 C++17 解决方案。
【问题讨论】:
-
Howard hinnant 的date library 应该可以直接打印时间而不需要转换成
time_t -
@AlanBirtles,谢谢你的建议。我还没有任何第三方依赖项,所以我有点犹豫添加这个库只是为了格式化一个日期。有没有使用标准库的替代方案?
-
您可以使用 c++20 日期库(源自 Howards),它是一个仅标头库,因此使用它只是从 github 下载标头并包含它的一种情况
-
@AlanBirtles:它尝试使用 Hinnant 的日期库头文件 (github.com/HowardHinnant/date/blob/master/include/date/date.h) 进行转换。然而,我失败了。只有 system_clock 可以进行简单的字符串转换,但文件系统使用 _File_time_clock。最后,我认为这不是“一目了然”的事情。如果您知道解决方案,您可以发布它。这个问题仍然没有公认的答案;-)。当前的答案显然是一种解决方法。
标签: c++ std-filesystem gcc9