4

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

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

我整天都在阅读日期时间输入/输出文档,但我似乎无法找到如何在需要时将 Z 放在末尾。此外,RFC 支持可选的小数秒,但只有一位数(例如“1990-12-31T23:59:60.5Z”)(*)。我似乎也无法找到如何做到这一点。

我总是可以编写自己的格式化例程来读出不同的所需字段,但在我看来,这与date_time图书馆的宗旨背道而驰。

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

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

4

1 回答 1

5
  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 函数中有类似的...

以及这个的示例用法

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"

using namespace boost::posix_time;
using namespace boost::local_time;

int main()
{
        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;
        return 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$

于 2009-01-30T12:16:31.313 回答