std::time_point 从和到 std::string
std::time_point from and to std::string
我正在尝试使用 c++20 std::chrono 替换一些 boost::gregorian 代码,希望删除增强构建依赖项。代码正在读取和写入 json(使用 nlohmann),因此将日期与 std::string 相互转换的能力至关重要。
在 Ubuntu 20.04 上使用 g++ 9.3.0。 2 个编译时错误,一个在 std::chrono::parse() 上,第二个在 std::put_time()
上
对于 std::chrono::parse() 上的错误 A,我看到 here 包括 chrono::parse 在内的日历支持 (P0355R7) 在 gcc libstdc++ 中尚不可用。任何人都知道这是否正确或为此向 ETA 发送 link?还是我调用 parse() 的方式有问题?
对于 std::put_time() 的错误 B:因为 std:put_time() 被记录为 c++11 感觉我在这里遗漏了一些愚蠢的东西。还觉得需要通过 c 的 time_t 和 tm 进行隐蔽很奇怪。有没有更好的方法将 std::chrono::time_point 直接转换为 std::string 而无需求助于 c?
#include <chrono>
#include <string>
#include <sstream>
#include <iostream>
int main(int argc, char *argv[]) {
std::chrono::system_clock::time_point myDate;
//Create time point from string
//Ref: https://en.cppreference.com/w/cpp/chrono/parse
std::stringstream ss;
ss << "2020-05-24";
ss >> std::chrono::parse("%Y-%m-%e", myDate); //error A: ‘parse’ is not a member of ‘std::chrono’
//Write time point to string
//https://en.cppreference.com/w/cpp/io/manip/put_time
//http://cgi.cse.unsw.edu.au/~cs6771/cppreference/en/cpp/chrono/time_point.html
std::string dateString;
std::time_t dateTime = std::chrono::system_clock::to_time_t(myDate);
std::tm tm = *std::localtime(&dateTime);
dateString = std::put_time(&tm, "%Y-%m-%e"); //error B: ‘put_time’ is not a member of ‘std’
//Write out
std::cout << "date: " << dateString << "\n";
return 0;
}
C++20 <chrono>
仍在为 gcc 构建。我没有看到它的 public 预计到达时间。
std::chrono::parse
的语法看起来是正确的。如果您愿意使用 free, open-source, header-only preview of C++20 <chrono>
,那么您可以通过添加 #include "date/date.h"
并改用 date::parse
来使其工作。
请注意,结果 myDate
将是 2020-05-24 00:00:00 UTC。
std::put_time
生活在header<iomanip>
,是操纵者。添加 header 和 <iostream>
后,您可以像这样使用它:
std::cout << "date: " << std::put_time(&tm, "%Y-%m-%e") << '\n';
如果您需要 std::string
中的输出,您必须先将操纵器流式传输到 std::stringstream
。
C++20 <chrono>
将提供替代 C API 的格式:
std::cout << "date: " << std::format("{%Y-%m-%e}", myDate) << '\n';
preview library 还提供了一个稍微改变的格式字符串:
std::cout << "date: " << date::format("%Y-%m-%e", myDate) << '\n';
我正在尝试使用 c++20 std::chrono 替换一些 boost::gregorian 代码,希望删除增强构建依赖项。代码正在读取和写入 json(使用 nlohmann),因此将日期与 std::string 相互转换的能力至关重要。
在 Ubuntu 20.04 上使用 g++ 9.3.0。 2 个编译时错误,一个在 std::chrono::parse() 上,第二个在 std::put_time()
上对于 std::chrono::parse() 上的错误 A,我看到 here 包括 chrono::parse 在内的日历支持 (P0355R7) 在 gcc libstdc++ 中尚不可用。任何人都知道这是否正确或为此向 ETA 发送 link?还是我调用 parse() 的方式有问题?
对于 std::put_time() 的错误 B:因为 std:put_time() 被记录为 c++11 感觉我在这里遗漏了一些愚蠢的东西。还觉得需要通过 c 的 time_t 和 tm 进行隐蔽很奇怪。有没有更好的方法将 std::chrono::time_point 直接转换为 std::string 而无需求助于 c?
#include <chrono>
#include <string>
#include <sstream>
#include <iostream>
int main(int argc, char *argv[]) {
std::chrono::system_clock::time_point myDate;
//Create time point from string
//Ref: https://en.cppreference.com/w/cpp/chrono/parse
std::stringstream ss;
ss << "2020-05-24";
ss >> std::chrono::parse("%Y-%m-%e", myDate); //error A: ‘parse’ is not a member of ‘std::chrono’
//Write time point to string
//https://en.cppreference.com/w/cpp/io/manip/put_time
//http://cgi.cse.unsw.edu.au/~cs6771/cppreference/en/cpp/chrono/time_point.html
std::string dateString;
std::time_t dateTime = std::chrono::system_clock::to_time_t(myDate);
std::tm tm = *std::localtime(&dateTime);
dateString = std::put_time(&tm, "%Y-%m-%e"); //error B: ‘put_time’ is not a member of ‘std’
//Write out
std::cout << "date: " << dateString << "\n";
return 0;
}
C++20 <chrono>
仍在为 gcc 构建。我没有看到它的 public 预计到达时间。
std::chrono::parse
的语法看起来是正确的。如果您愿意使用 free, open-source, header-only preview of C++20 <chrono>
,那么您可以通过添加 #include "date/date.h"
并改用 date::parse
来使其工作。
请注意,结果 myDate
将是 2020-05-24 00:00:00 UTC。
std::put_time
生活在header<iomanip>
,是操纵者。添加 header 和 <iostream>
后,您可以像这样使用它:
std::cout << "date: " << std::put_time(&tm, "%Y-%m-%e") << '\n';
如果您需要 std::string
中的输出,您必须先将操纵器流式传输到 std::stringstream
。
C++20 <chrono>
将提供替代 C API 的格式:
std::cout << "date: " << std::format("{%Y-%m-%e}", myDate) << '\n';
preview library 还提供了一个稍微改变的格式字符串:
std::cout << "date: " << date::format("%Y-%m-%e", myDate) << '\n';