提问人:ridilculous 提问时间:7/6/2023 最后编辑:Nicol Bolasridilculous 更新时间:7/6/2023 访问量:92
C++ 使用“last”-day 表示法解析日期时间字符串
C++ parse datetime string with "last"-day notation
问:
std::chrono::year_month_day_last
提供了一种非常方便的方式来表示年/月对的最后几天。
是否有可能使用 std::chrono::p arse
、Howard Hinnant 的免费、开源、C++11、仅标头的日期时间库或 boost 来解析日期字符串,其中“最后一个”部分被建模为值零或没有值,例如解析“2023-01-00”或“2023-01”为?year_month_day_last{2023y / January / last}
答:
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
我喜欢“最后”模型,但短期内我正在寻找替代品:)这是略微修改的版本。
评论