使用 yaml-cpp 解析 YAML !!timestamp(日期时间)

Posted

技术标签:

【中文标题】使用 yaml-cpp 解析 YAML !!timestamp(日期时间)【英文标题】:Parsing YAML !!timestamp (date time) with yaml-cpp 【发布时间】:2013-05-09 21:07:59 【问题描述】:

我正在使用 yaml-cpp 惊人的库来解析 YAML 文件,我需要解析一个 !!timestamp 类型的标量。例如:

- timeSpec:
    startTime: 2013-05-15T02:59:43.138Z
    endTime: 2013-05-23T02:59:43.138Z

1 - 我该怎么做?我应该将其解析为 std::string 并自己处理日期时间的解析吗?我是否需要导入一些 boost 库以便数据类型转换简单?

2 - 一般来说,库支持哪些YAML basic data types?

【问题讨论】:

【参考方案1】:

您必须自己解析日期时间。如果你有一些结构DateTime,作为骨架,你可以这样写:

namespace YAML 
   template<>
   struct convert<DateTime> 
      static Node encode(const DateTime& rhs) 
         std::string str = YourCodeToConvertToAString(rhs);
         return Node(str);
      

      static bool decode(const Node& node, DateTime& rhs) 
         if(!node.IsScalar())
            return false;

         std::string str = node.as<std::string>();
         // Fill in the DateTime struct.
         return true;
      
   ;

如果你能找到一个库(也许是 boost)来做到这一点,那会更容易,但日期时间的 YAML 格式可能不是其他库所期望的。

一般来说,yaml-cpp 不支持任何自动类型检测。

【讨论】:

谢谢你的回答,杰西。这就是我正在做的事情,但由于 yaml-cpp 使用 boost 库,我只是想确认使用 boost Date Time 库没有很酷的方法。再次感谢您提供的出色库,我喜欢新的 api。【参考方案2】:

我知道这有点晚了,但我遇到了同样的事情。对我来说最快、最简单的解决方案是在 YAML 文档字符串中制作日期并使用 boost 将字符串转换为 posix 时间类型:

boost::posix_time::from_iso_string(node[0]["timeSpec"]["startTime"].as<std::string>())

【讨论】:

以上是关于使用 yaml-cpp 解析 YAML !!timestamp(日期时间)的主要内容,如果未能解决你的问题,请参考以下文章

YAML 未解析的外部符号 (yaml-cpp)

使用 yaml-cpp 解析 YAML 时的内存消耗

使用 YAML-CPP 发出解析文件

如何使用 yaml-cpp 发出和解析原始二进制数据

yaml解析的方式? (yaml-cpp)

如何在不知道终端标量的映射和类型中的键的情况下使用 yaml-cpp 库解析任意 yaml 文件?