如何在Boost :: DateTime

时间:2017-10-09 14:42:57

标签: c++ boost

在我正在处理的应用程序中,我收到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更改为无效的日期时间,例如&#34; 2017-01-31T02:15:63Z&#34; (不应接受63秒),则输出将为

2017-Jan-31 02:16:03

而不是&#34;失败&#34;信息。我理解背后的逻辑,但我想强制执行更严格的解析。此外,当使用&#34; 2017-01-31T02:15:53Z时,解析仍然可以使用Stackoverflow&#34; 作为输入,考虑到它并不是很奇怪尊重指定的格式。

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

由于

1 个答案:

答案 0 :(得分:2)

您可以使用其他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