gpt4 book ai didi

c++ - 如何在 Boost::DateTime 中强制执行严格解析

转载 作者:太空狗 更新时间:2023-10-29 21:34:24 25 4
gpt4 key购买 nike

在我正在处理的应用程序中,我收到一个 ISO 格式的日期时间作为输入 (%Y-%m-%dT%H:%M:%SZ)。

我想检查接收到的字符串是否确实是指定的格式。我想试用 Boost DateTime 库,它似乎非常适合这项任务。

但是,我对 DateTime 解析的行为感到惊讶。我的代码如下:

#include <string>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <sstream>

int main()
{
std::string inputDate = "2017-01-31T02:15:53Z";
std::string expectedFormat = "%Y-%m-%dT%H:%M:%SZ";

boost::posix_time::time_input_facet *timeFacet = new boost::posix_time::time_input_facet(expectedFormat);

std::stringstream datetimeStream(inputDate);
datetimeStream.imbue(std::locale(std::locale::classic(), timeFacet));

boost::posix_time::ptime outputTime;
datetimeStream >> outputTime;
if (datetimeStream.fail())
{
std::cout << "Failure" << std::endl;
}
std::cout << outputTime << std::endl;
return 0;
}

运行该程序时,输出为:

2017-Jan-31 02:15:53

正如预期的那样。但是,如果我将 inputDate 更改为无效的日期时间,例如 "2017-01-31T02:15:63Z"(不应接受 63 秒),输出将为

2017-Jan-31 02:16:03

而不是“失败”消息。我理解背后的逻辑,但我想执行更严格的解析。此外,当使用 "2017-01-31T02:15:53Z I like Stackoverflow" 作为输入时,解析仍然有效,考虑到它不遵守指定的格式,这更奇怪。

所以我的问题是:如何强制 Boost DateTime 拒绝不严格遵守 time_input_facet 中定义的格式的字符串?

谢谢

最佳答案

你能用另一个吗free, open-source, header-only date/time library

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

int
main()
{
std::string inputDate = "2017-01-31T02:15:63Z";
std::string expectedFormat = "%Y-%m-%dT%H:%M:%SZ";
std::stringstream datetimeStream{inputDate};
date::sys_seconds outputTime;
datetimeStream >> date::parse(expectedFormat, outputTime);
if (datetimeStream.fail())
{
std::cout << "Failure" << std::endl;
}
using date::operator<<;
std::cout << outputTime << std::endl;
}

输出:

Failure
1970-01-01 00:00:00

关于c++ - 如何在 Boost::DateTime 中强制执行严格解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46649119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com