c++ - 如何根据 RFC 3339 格式化 boost::date_time-object

标签 c++ boost-date-time rfc3339

我想在 boost 中使用 date_time 库来表示我的应用程序中的时间。此应用程序将生成 Atom 提要,后者又会以 RFC 3339 中指定的格式强制要求时间戳。 ,例如“1990-12-31T23:59:60Z”或“1990-12-31T15:59:60-08:00”。

那么,我该如何根据这个 RFC 格式化时间呢?

我一直在阅读 Date Time Input/Output documentation一整天,我似乎无法找到如何在需要时将 Z 放在最后。此外,RFC 支持可选的小数秒,但只有一位数字(例如“1990-12-31T23:59:60.5Z”)(*)。我似乎也不知道该怎么做。

我总是可以编写自己的格式化例程来读取不同的所需字段,但在我看来这与 date_time 库的结构背道而驰。

有为这个库编写格式化程序的经验吗?还是我做错了什么?

(*): 在我看来,RFC 中给出的 ABNF 只允许一位数的小数秒,但同一个 RFC 中的示例有两位数的小数秒。这是什么意思?

最佳答案

  1. RFC 中的 ABNF 表示点后必须至少有一位数字,没有定义最大值。

  2. Z 并不是真正需要的,您可以使用 00:00 代替,这可以通过分面实现

  3. 在极少数情况下,date_time 会生成“Z”。请参阅来自 boost (local_date_time.hpp) 的代码快照,它表明如下所示:


    std::string zone_name(bool as_offset=false) const
    {
      if(zone_ == boost::shared_ptr()) {
        if(as_offset) {
          return std::string("Z");
        }
        else {
          return std::string("Coordinated Universal Time");
        }
    ...

zone_abbrev函数中有类似if...

以及这个的用法示例

slimak@daradei:~/store/kodowanie/moje/test$ cat boost_date_time.cpp
#include "boost/date_time.hpp"
#include "boost/date_time/local_time/local_time.hpp"

使用命名空间 boost::posix_time;
使用命名空间 boost::local_time;

主函数()
{
        local_date_time t = local_sec_clock::local_time(time_zone_ptr());
        local_time_facet* lf(new local_time_facet("%Y-%m-%dT%H:%M:%S%F%Q"));
        std::cout.imbue(std::locale(std::cout.getloc(), lf));
        std::cout << t << std::endl;
        返回 0;
}
slimak@daradei:~/store/kodowanie/moje/test$ g++ boost_date_time.cpp && ./a.out
2009-01-30T12:15:56Z
slimak@daradei:~/store/kodowanie/moje/test$

关于c++ - 如何根据 RFC 3339 格式化 boost::date_time-object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/491883/

相关文章:

c++ - MFC - 如何在运行时更新编辑框? (C++)

c++ - Eclipse CDT 中优化的项目结构

c++ - Boost 库缺少 'libboost_date_time-vc90-mt-gd-1_44.lib 文件。如何使用 bjam 只构建这个 lib 文件?

c++ - 如何获取 Windows 当前的 Boost 时区?

python - 如何在 Python 中解释原始的 RFC 3339 日期时间字符串?

c++ - 使用没有虚拟的模板从基类调用派生类函数

c++ - 在 C++ 运算符中调用析构函数以释放内存的正确方法是什么?

c++ - 时区之间的时间转换

date - 如何在 Swift 中解析/创建格式为小数秒 UTC 时区(ISO 8601、RFC 3339)的日期时间戳?

objective-c - 在 iOS 中解析 RFC3339 日期字符串的最简单方法是什么?