C++11 如何将std::chrono::time_点转换为字符串

C++11 如何将std::chrono::time_点转换为字符串

C++11 如何将std::chrono::time_点转换为字符串,c++11,chrono,C++11,Chrono,如何将std::chrono::time\u point转换为字符串? 例如:“201601161125”最灵活的方法是将其转换为struct tm,然后使用strftime(类似于时间的sprintf)。比如: std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); std::time_t now_c = std::chrono::system_clock::to_time_t(now); st

如何将

std::chrono::time\u point

转换为字符串?


例如:

“201601161125”

最灵活的方法是将其转换为

struct tm

,然后使用

strftime

(类似于时间的

sprintf

)。比如:

std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
std::tm now_tm = *std::localtime(&now_c);
/// now you can format the string as you like with `strftime`

在文档中查找strftime 如果您有

localtime\s

localtime\r

可用,则应优先使用

localtime

有许多其他方法可以做到这一点,但是,尽管大多数方法更易于使用,但这些方法会产生一些预定义的字符串表示。您可以在一个函数中“隐藏”以上所有内容,以便于使用。是一种现代化的方法,它不需要通过旧的C API进行通信,也不需要您放弃所有次秒级的信息。这个图书馆也正在建设中 格式化有很大的灵活性。最简单的方法是流式输出:

#include "date.h"
#include <iostream>

int
main()
{
    using namespace date;
    std::cout << std::chrono::system_clock::now() << '\n';
}
使用名称空间日期才能找到系统时钟::时间点(我的lib将其插入命名空间std::chrono是不合法的)。此格式不会丢失任何信息:将输出系统时钟::时间点的全部精度(微秒,我在macOS上运行了此操作)
全套的可用于其他格式,还有一些小的扩展来处理分数秒之类的事情。以下是以毫秒精度输出的另一个示例:
#include "date.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std::chrono;
    std::cout << format("%D %T %Z\n", floor<milliseconds>(system_clock::now()));
}

代码解决方案
以下函数将chronotime\u point转换为字符串(序列化)
#包括
#包括
#包括
使用时间点=标准::时钟::系统时钟::时间点;
标准::字符串序列化时间点(常数时间点和时间,常数标准::字符串和格式)
{
std::time\u t tt=std::chrono::system\u clock::to\u time\u t(时间);
std::tm=*std::gmtime(&tt);//GMT(UTC)
//std::tm=*std::localtime(&tt);//语言环境时区,默认情况下通常为UTC。
std::stringstream-ss;
ss您是否尝试过将其插入到std::stringstream中,然后使用stringstream的成员函数.str()将其转换为字符串?不,我没有。我会这样做。如果您的提示有效,我会让您知道。请参阅:部分“日期时间类型如何?”我认为这里的示例最好不要使用任何名称空间,以便更清楚哪些函数和类型来自哪个名称空间。问题之一是名称空间随时间而变化:floor位于名称空间date,但从C++17开始位于名称空间std::chrono。通过C++20,所有内容都将是std::chrono@HowardHinnant是否有一种简单的方法来丢弃date::format(“%FT%TZ”,p)生成的字符串的次秒部分中的尾随零(以及,如果需要)其中p是一个系统时钟::时间点?控制输出精度的最佳方法是将输入精度截断为格式,例如在上面的示例中截断为毫秒。在运行时没有自动检测尾随零的方法。唯一的方法是因此,在生成的字符串上进行自定义后处理(反向搜索零)。为什么这是使用欣南特的库?欣南特先生的库不是C++标准的一部分,而 STFFTIME()一直是C标准的一部分。在C++ 20中,欣南特先生的库将成为C++标准的一部分——当发生这种情况时,很难做出一个坚定的偏好(这将取决于你的需求和经验)。从它=>引擎盖下的冗余malloc。有std::string\u视图用于此目的。正确,如果您可以访问C++17,您可以使用std::string\u视图优化此代码,否则,const char*也是可能的。
#include "date.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std::chrono;
    std::cout << format("%D %T %Z\n", floor<milliseconds>(system_clock::now()));
}

09/15/17 13:17:40.466 UTC

#include <chrono>
#include <iomanip>
#include <sstream>

using time_point = std::chrono::system_clock::time_point;
std::string serializeTimePoint( const time_point& time, const std::string& format)
{
    std::time_t tt = std::chrono::system_clock::to_time_t(time);
    std::tm tm = *std::gmtime(&tt); //GMT (UTC)
    //std::tm tm = *std::localtime(&tt); //Locale time-zone, usually UTC by default.
    std::stringstream ss;
    ss << std::put_time( &tm, format.c_str() );
    return ss.str();
}

// example
int main()
{
    time_point input = std::chrono::system_clock::now();
    std::cout << serializeTimePoint(input, "UTC: %Y-%m-%d %H:%M:%S") << std::endl;

}
                                                

转自:http://duoduokou.com/cplusplus11/35911758432065632908.html

posted @ 2023-02-17 21:29  MasonLee  阅读(893)  评论(0编辑  收藏  举报