我std::get_time用來決議文本中的日期。在大多數情況下它就足夠了,但是在讀取沒有分隔符的日期時(例如31122021,使用 format "%d%m%Y")我總是失敗。我使用它是因為我看到它被描述為相當于 python 的strptime(https://stackoverflow.com/a/33542189/15061775),它確實管理這個用例(如何將 8 位數字決議為日期?)。
這是我的代碼(經過 MRE 測驗):
#include <cassert>
#include <ctime>
#include <iomanip>
#include <sstream>
#define MAKEDATE(d,m,y) (((y&0xFFFF)<<16)|((m&0xFF)<<8)|(d&0xFF))
uint32_t Get_Date(const char *str_date, const char **out, const char *format)
{
std::tm dt = {};
std::istringstream stream(str_date);
stream >> std::get_time(&dt, format);
if (stream.fail())
{
if (out) *out = NULL;
return MAKEDATE(1, 1, 1900);
}
else
{
if (out) *out = str_date (int)stream.tellg();
return MAKEDATE(dt.tm_mday, 1 dt.tm_mon, 1900 dt.tm_year);
}
}
int main(void)
{
assert(Get_Date("31122021", NULL, "%d%m%Y") == MAKEDATE(31, 12, 2021));
}
我使用 VS2017 的默認編譯器設定使用 MFC 和 CLI 編譯它,MSVC 19.10.25027。
我做錯了嗎?我可以使用另一個標志或一組標志嗎?還有另一種簡單的決議方法嗎?
uj5u.com熱心網友回復:
這是編譯器特定的問題。如果此特定方法需要處理此特定輸入,則必須使用不同的編譯器。
參考此鏈接;
MSVC 14.0 中的 std::get_time 似乎無法決議未定界的日期和時間值,例如 ISO-8601 基本格式中的那些值。以下代碼在 MSVC 中失敗,但在 GCC 5.2 中正常作業。<代碼示例>
和
似乎是眾所周知的:<defunct, very old link>
可以得出結論,MSVC 編譯std::get_time從未能夠決議非分隔輸入。據報道 GCC 可以作業,而 CLang 肯定可以,所以 MSVC 是一個奇怪的人。
如果切換編譯器不值得麻煩,則可以使用更具體的決議方法。
// Assuming str_date is guaranteed to be 8 digits
uint32_t Get_Date_YMD(const char *str_date)
{
return
(((str_date[0] - '0') * 1000
( str_date[1] - '0') * 100
( str_date[2] - '0') * 10
( str_date[3] - '0')) << 16) |
(((str_date[4] - '0') * 10
( str_date[5] - '0')) << 8) |
(( str_date[6] - '0') * 10
( str_date[7] - '0'));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/353133.html
上一篇:具有24小時格式的WhatsApp聊天文本檔案的日期模式,split()錯誤:要解壓縮的值太多
下一篇:Spark的安裝及其配置
