gpt4 book ai didi

c++ - std::time_point往返于std::string

转载 作者:行者123 更新时间:2023-12-01 14:42:47 29 4
gpt4 key购买 nike

我正在尝试使用c++ 20 std::chrono替换一些boost::gregorian代码,以期消除boost的构建缺陷。代码正在读写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?还是我调用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构建。我还没有看到公开的ETA。

您的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++ - std::time_point往返于std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62086918/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com