C++ 使用“last”-day 表示法解析日期时间字符串

C++ parse datetime string with "last"-day notation

提问人:ridilculous 提问时间:7/6/2023 最后编辑:Nicol Bolasridilculous 更新时间:7/6/2023 访问量:92

问:

std::chrono::year_month_day_last 提供了一种非常方便的方式来表示年/月对的最后几天。

是否有可能使用 std::chrono::p arseHoward Hinnant 的免费、开源、C++11、仅标头的日期时间库boost 来解析日期字符串,其中“最后一个”部分被建模为值零或没有值,例如解析“2023-01-00”或“2023-01”为?year_month_day_last{2023y / January / last}

C datetime 解析 ++20 C ++-chrono

评论


答:

3赞 Howard Hinnant 7/6/2023 #1

用字符串建模的零件怎么样?last"last"

#include "date/date.h"
#include <chrono>
#include <iostream>
#include <sstream>

date::year_month_day
my_parse(std::istream& is)
{
    using namespace date;
    using namespace std;
    using namespace chrono;

    year_month_day result{};
    year_month ym;
    is >> parse(" %Y-%m-", ym);
    if (!is.fail())
    {
        if (isdigit(is.peek()))
        {
            day d;
            is >> parse("%d", d);
            if (!is.fail())
                result = ym/d;
        }
        else
        {
            string word;
            is >> word;
            if (word != "last")
                is.setstate(ios::failbit);
            else
                result = ym/last;
        }
    }
    return result;
}

对于 C++20,删除 和 .#include "date/date.h"using namespace date;

只需阅读年份、月份和尾随,然后测试一下是否有数字。如果 number 是日期数字,否则最好是字符串“last”。-

格式字符串中的起始空格匹配零个或多个空格字符。

这可以通过以下方式进行:

int
main()
{
    using namespace std;

    istringstream in{"2023-01-30 2023-01-last"};
    in.exceptions(ios::failbit);
    auto date1 = my_parse(in);
    cout << date1 << '\n';
    auto date2 = my_parse(in);
    cout << date2 << '\n';
}

输出:

2023-01-30
2023-01-31

评论

1赞 ridilculous 7/6/2023
我喜欢“最后”模型,但短期内我正在寻找替代品:)这是略微修改的版本