簡體   English   中英

使用 std::format 將 time_point 轉換為字符串,格式包括日期、時間和亞秒

[英]Convert time_point to string using std::format with format that includes date, time and subseconds

假設我們有一個簡單的函數,它接受一個 std::chrono::time_point 並使用給定的格式化字符串返回一個字符串。 像這樣:

std::string DateTimeToString(std::chrono::sys_time, const char * szFormat /*= "%Y/%m/%d %H:%M:%S"*/)

根據std::formatter的 cppreference 文檔,我們應該能夠使用各個標簽來創建像2021/03/24 15:36:32.123123這樣的字符串。 但是,當 time_point 的持續時間使用微秒(我們必須使用)時,這將引發 format_error。

如果我們將其拆分為單獨的調用,以便我們分別使用日期和時間的格式,那么它就可以工作。 像這樣:

auto tSysTime = std::chrono::system_clock::now();
std::string sTime = std::format("{:%H:%M:%S}", tSysTime.time_since_epoch());
std::string sDate = std::format("{:%Y/%m/%d}", std::chrono::sys_days(std::chrono::duration_cast<std::chrono::days>(tSysTime.time_since_epoch())));

我是否誤解了某些東西,或者沒有辦法為我的目的使用單一格式字符串? 請記住,格式字符串是一個可選參數,因此我無法對單個參數的拆分進行硬編碼。

我的期望是寫

std::format("{:%Y/%m/%d %H:%M:%S}",tSysTime.time_since_epoch());

然而,這崩潰了......

預先感謝您的任何幫助!

編輯:我在 Visual Studio 2019 中使用 /std::c++latest 標志

你需要:

std::format("{:%Y/%m/%d %H:%M:%S}",tSysTime);

或者您可以將其簡化為:

std::format("{:%Y/%m/%d %T}",tSysTime);

如果您system_clock::time_point::duration不是microseconds ,可以將其強制微秒精度:

std::format("{:%Y/%m/%d %T}",floor<microseconds>(tSysTime));

原因std::format("{:%Y/%m/%d %H:%M:%S}",tSysTime.time_since_epoch()); 失敗是.time_since_epoch()time_point變成了duration duration對日期一無所知。 例如,如果你問我當前的日期和時間是什么,我告訴你 1,616,600,192,123,123µs,你會看着我很有趣。 duration對紀元一無所知。 duration只是兩個time_point之間的時間度量。

另一方面, time_point知道一個紀元。 它包含一個duration並意味着:超過(或之前)我的時代的這段時間duration

std::format理解time_pointduration之間的區別。 因此,如果格式字符串要求輸入日期(例如%Y/%m/%d )並且您正在格式化一個duration ,它會拋出一個異常,表明信息不足以完成請求的工作。 但是如果你給它一個time_point ,那么std::format知道如何從中獲取日期信息。

這是<chrono>構建的類型安全設計的一部分,因此可以盡早捕獲盡可能多的邏輯錯誤。

int64_t i = 1'616'600'192'123'123;
microseconds d{i};
sys_time<microseconds> t{d};
cout << "i = " << i << '\n';
cout << "d = " << d << '\n';
cout << "t = " << t << '\n';

idt在內存中都擁有相同的值:1,616,600,192,123,123,但含義不同。 當你打印出來時,你會看到這些不同的含義:

i = 1616600192123123
d = 1616600192123123µs
t = 2021-03-24 15:36:32.123123

這與:

char x = 'A';
int y{x};
cout << "x = " << x << '\n';  // x = A
cout << "y = " << y << '\n';  // y = 65

暫無
暫無

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

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