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

时间:2009-01-29 14:49:35

标签: 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 个答案:

答案 0 :(得分:5)

  1. 来自RFC的ABNF说,点后必须至少有一个数字,没有定义的最大值。

  2. 不需要Z,你可以用00:00代替,这可以用facet

  3. 在极少数情况下,date_time会生成“Z”。请参阅boost(local_date_time.hpp)中的代码快照,该快照表明以下内容:

  4. 
        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$
    

    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$