C++ 日期解析实现

Posted

技术标签:

【中文标题】C++ 日期解析实现【英文标题】:C++ Date Parsing Implementation 【发布时间】:2012-10-24 10:57:37 【问题描述】:

我目前正在将日期解析为程序。

格式可以是以下形式:

DDMMYYYY
DDMMYY
DDMM

DD/MM/YYYY
DD/MM/YY
DD/MM

除了日期之外,还会包含其他内容,如下所示:

19/12/12 0800 1000

这打破了我当前使用 boost::date_time 和标记器的实现。

对于这种情况,最好的建议是什么?我是否能够有一个更好的实现来允许以下内容:

19 Sep 12  // DD MMM YY

我的想法是将它们以 DDMMYYYY 形式的字符串形式返回,以便在程序的其他部分使用。这是最好的方法还是有更好的建议/替代方案?

*编辑:

决定服用 DDMMYYYY、DDMMYY 和 DDMM 不太可行。只能使用带有反斜杠的日期。

输出保持不变,格式为:DDMMYYYY

【问题讨论】:

你知道字符串的哪一部分是日期吗?然后,您可以提取该部分并使用您的解析器代替。 不,它非常灵活。我想到的是使用正则表达式 您的示例数据看起来不明确。日期可能是四位数字,但在示例中还有其他四位数字不是日期。像19/12/12 1000 0801 这样的情况会发生吗?在这种情况下,您有两个可能的日期。您将如何决定使用哪一个?或者你会将两者都算作日期? 如果它真的是所有这些,在文本中的任何位置,并且其中可以有其他四位、六位或八位数字,那么你几乎迷路了,因为它做不到(没有额外信息)。 在这种情况下,我假设带有反斜杠的标记是日期,4 位数字的标记是时间。 【参考方案1】:

使用 boost.regex,您可以执行以下操作:

#include <iostream>
#include <boost/regex.hpp>

using namespace std;
using namespace boost;

int main(int argc, char* argv[])

    regex re("(\\d2)\\/(\\d2)(?:\\/?(\\d2,4))?");

    cmatch m;

    regex_search("1234 10/10/2012 4567", m, re);
    cout << m.str(1) + m.str(2) + m.str(3) << endl;
    regex_search("1234 10/10/12 4567", m, re);
    cout << m.str(1) + m.str(2) + m.str(3) << endl;
    regex_search("1234 10/10 4567", m, re);
    cout << m.str(1) + m.str(2) << endl;

    return 0;

像这样编译:

g++ --std=c++11 -o test.a test.cpp -I[boost_path] [boost_path]/stage/lib/libboost_regex.a

【讨论】:

【参考方案2】:

您可以使用一些正则表达式库或内置 sscanf 函数。它比 reg exp 更原始,但可以在您的情况下使用

/* sscanf example */
#include <stdio.h>

int main ()

   char sentence []="data 1";
   char str [16];
   int i;

   sscanf(sentence,"%s %d",str,&i);
   printf("%s -> %d\n",str,i);

 return 0;

【讨论】:

我不认为这会很好用,因为有很多可能的输入。您最终将不得不多次扫描字符串以寻找不同的可能性,即使那样您也必须验证有效的月份、日期等。如果他已经在使用boost,他大概可以访问正则表达式库。跨度> 【参考方案3】:

以下代码对我有用。

regex regExDate("\\d4-\\d2-\\d2");
string date = "abc:\\2016-09-12";
smatch match;

if (regex_search(date, match, regExDate))

 string strDate = match.str();

【讨论】:

以上是关于C++ 日期解析实现的主要内容,如果未能解决你的问题,请参考以下文章

将日期和时间字符串解析为数字以比较 C++

在 Windows C++ 中将字符串解析为日期的区域感知

请问,在C++中怎样将一个LONGLONG型转换(或解析)为一个日期型?

C++ 控制台:解析 METAR 数据

C++实现对数学基本运算表达式的解析

C++实现对数学基本运算表达式的解析