我需要能夠根據 ISO-8601 標準的子集決議和存盤各種日期、時間或兩者。
日期采用以下格式:
- YYYY
- YYYY-mm
- YYYY-mm-dd
時間格式如下:
- 時:分:秒
- 時:分:SS.ffffff
如果同時定義了日期和時間,則還必須定義時區,如下所示:
- YYYY-mm-ddTHH:MM:SS.ffffff ZZ:ZZ
- 例如:2012-03-04T05:06:07.123456 07:00
我嘗試使用 Howard Hinnant 的日期庫,與 C 20 標準中的日期庫相同。看來我需要使用特定型別來決議不同的格式,這有點煩人。我寧愿能夠決議和存盤相同型別的任何格式。
為了說明問題:
sys_time<microseconds> sys_us;
microseconds us;
year_month ym;
year y;
std::istringstream iss;
iss.str("2012-03-04T05:06:07.123456 07:00");
iss >> date::parse("%FT%T%Ez", sys_us); // Only works with this type. (The others can't parse this much info.)
assert(!iss.fail());
iss.str("2012-03-04");
iss >> date::parse("%F", sys_us); // If the date has the full year, month, and day, this works.
assert(!iss.fail());
iss.str("2012-03");
// iss >> date::parse("%Y-%m", sys_us); // This fails; day is missing.
iss >> date::parse("%Y-%m", ym); // Works.
assert(!iss.fail());
iss.str("2012");
// iss >> date::parse("%Y", sys_us); // This fails.
// iss >> date::parse("%Y", ym); // Also fails; month is missing.
iss >> date::parse("%Y", y); // Works.
assert(!iss.fail());
iss.str("05:06:07.123456");
// iss >> date::parse("%T", sys_us); // Also fails; unhappy with missing date.
iss >> date::parse("%T", us); // Must use duration type for time instead.
assert(!iss.fail());
如果我可以date::parse(format, obj)在obj不需要更改型別的地方,那就更好了。那可能嗎?
uj5u.com熱心網友回復:
將它們全部存盤在同一型別中的唯一方法是選擇資訊最多的那個 ( sys_time<microseconds>),然后按照您顯示的方式在部分型別中進行決議,并為那些未決議的值添加默認值。
例如:
iss.str("05:06:07.123456");
iss >> date::parse("%T", us); // Must use duration type for time
sys_us = sys_days{year{0}/1/1} us; // Add defaulted date
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/353821.html
