【问题标题】:Library to parse descriptions of recurring dates in C++?用于解析 C++ 中重复日期描述的库?
【发布时间】:2010-12-17 21:59:44
【问题描述】:

对于我的应用程序,我需要一个可以处理日期直接描述的解析器,例如“12/31/10”表示今年的除夕,但也可以处理 /repeating/ 日期的描述,例如“每个月的第一个星期一。” boost::date_time 已经有了日期生成器的概念,但我认为它没有提供任何通用的方法来将字符串转换为它们,而无需知道将生成的生成器的类型。

在我去重新发明轮子之前,是否已经有一些东西可以做到这一点?我对字符串的确切语言很灵活,只要它是非程序员可以阅读和理解的东西。

【问题讨论】:

    标签: c++ parsing boost date calendar


    【解决方案1】:

    您可以使用美妙的 boost::spirit 库。

    它可以让你轻松地为这类事情创建解析器。

    【讨论】:

    • +1 精神是一个很棒的图书馆,不要被它的范围吓倒。文档和示例非常有用。
    【解决方案2】:

    也许你可以从Roaring Penguin's remind tool 中汲取灵感,它的语言相当容易理解(对于简单的情况)。

    【讨论】:

      【解决方案3】:

      您可以在 EBNF 中编写自己的语法,然后使用词法分析器/解析器生成器为您创建代码骨架。

      【讨论】:

        【解决方案4】:

        使用this library,下面是打印出 2011 年每个月的第一个星期一的代码:

        #include "date.h"
        #include <iostream>
        
        int main()
        {
            using namespace gregorian;
            std::cout << date_fmt("%A %B %e, %Y");
            for (date d = first*mon/jan/2011; d <= dec/31/2011; d += month(1))
                std::cout << d << '\n';
        }
        

        输出:

        Monday January  3, 2011
        Monday February  7, 2011
        Monday March  7, 2011
        Monday April  4, 2011
        Monday May  2, 2011
        Monday June  6, 2011
        Monday July  4, 2011
        Monday August  1, 2011
        Monday September  5, 2011
        Monday October  3, 2011
        Monday November  7, 2011
        Monday December  5, 2011
        

        您还可以获得一个月的第二个、第三个等或最后一个工作日。算术可以面向日、月或年。

        【讨论】:

        • 这与问题所要求的完全相反。不过有趣的图书馆。
        • 同意。一旦构建了 OP 的解析器,也许这个日期库将有助于表示解析器的输出。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-07
        • 2022-01-04
        • 1970-01-01
        相关资源
        最近更新 更多