簡體   English   中英

如何將std :: chrono :: time_point轉換為字符串

[英]How to convert std::chrono::time_point to string

如何將std::chrono::time_point轉換為字符串? 例如: "201601161125"

霍華德·辛南特(Howard Hinnant)的免費,開放源代碼,僅標頭的可移植日期/時間庫是一種實現此目的的現代方法,它不會通過舊的C API進行交易,也不需要您丟棄所有亞秒級信息。 該庫也正在提議進行標准化

格式化具有很大的靈活性。 最簡單的方法是流式輸出:

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

int
main()
{
    using namespace date;
    std::cout << std::chrono::system_clock::now() << '\n';
}

這只是為我輸出:

2017-09-15 13:11:34.356648

using namespace date; 為了找到system_clock::time_point的流運算符是必需的(我的lib將其插入namespace std::chrono system_clock::time_point是非法的)。 此格式不會丟失任何信息:將輸出system_clock::time_point的完整精度(我在macOS上運行它的microseconds )。

全套類似於strftime的格式設置標志可用於其他格式,並進行較小的擴展以處理小數秒之類的內容。 這是另一個以毫秒為單位輸出的示例:

#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

最靈活的方法是將其轉換為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_slocaltime_r可用,則應優先使用localtime

還有許多其他方法可以執行此操作,但是雖然大多數情況下更易於使用,但它們會產生一些預定義的字符串表示形式。 您可以將以上所有內容“隱藏”在一個函數中,以易於使用。

代碼解決方案

從下面的函數轉換chrono time_point串(序列化)。

#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;

}

時區

time_point數據類型沒有時區的內部表示,因此,時區通過轉換為std::tm (通過函數gmtimelocaltime )進行聚合。 不建議從輸入中添加/減去時區,因為使用%Z會顯示不正確的時區,因此,最好設置正確的本地時間(取決於OS)並使用localtime()

技術與用戶友好的序列化

對於技術用途,硬編碼的時間格式是一個很好的解決方案。 但是,要向用戶顯示,應使用locale來檢索用戶首選項,並以該格式顯示時間戳。

C ++ 20

從C ++ 20開始,我們對time_point和duration具有很好的序列化和解析功能。

  • std::chrono::to_stream
  • std::chrono::format

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM