当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何根据RFC3339格式化boost::date_time-object》经验,为你挑选了1个好方法。

我想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中的示例有两位数的小数秒.那是什么意思?



1> Slimak..:

    来自RFC的ABNF表示在点之后必须至少有一个数字,没有定义的最大值.

    没有真正需要Z,你可以使用00:00代替,这可以通过facet实现

    在一些罕见的情况下,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$

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有