[英]How to parse 8-digit date in C++?
我使用std::get_time
從文本中解析日期。 在大多數情況下它就足夠了,但是當讀取沒有分隔符的日期時(例如31122021
,格式為"%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。
我做錯了嗎? 我可以使用另一個標志或一組標志嗎? 還有另一種簡單的解析方法嗎?
這是編譯器特定的問題。 如果此特定方法需要處理此特定輸入,則必須使用不同的編譯器。
引用此鏈接;
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'));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.