簡體   English   中英

如何在 C++ 中解析 8 位日期?

[英]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.

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