我使用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));
}我使用it 2017的默认编译器设置使用MFC和CLI编译它,使用MSVC 19.10.25027。
我搞错了吗?我还能用其他的旗子或一组旗子吗?还有另外一种简单的解析方法吗?
发布于 2021-11-05 10:28:29
这是编译器特有的问题。如果这个特定的方法需要处理这个特定的输入,那么您必须使用不同的编译器。
引用这个链接;
看来,MSVC14.0中的std::get_time不解析未分隔的日期和时间值,例如在ISO8601基本格式中找到的日期和时间值。下面的代码在MSVC中失败,但在GCC 5.2中工作正常。
和
似乎大家都知道:< 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://stackoverflow.com/questions/69840271
复制相似问题