2009-01-29 89 views
4

格式化boost :: date_time-object我想在boost中使用date_time庫來表示我的應用程序中的時間。此應用程序將生成Atom訂閱源,然後按照RFC 3339中指定的格式(例如「1990-12-31T23:59:60Z」或「1990-12-31T15:59:60-08:00」)指定時間戳。 。如何按照RFC 3339

那麼,如何根據此RFC格式化時間?

我一直在閱讀Date Time Input/Output documentation,我似乎無法知道如何在需要時將Z放在最後。此外,RFC支持可選的小數秒,但僅支持其一個數字(例如「1990-12-31T23:59:60.5Z」)(*)。我似乎無法找到如何做到這一點。

我總是可以編寫自己的格式化程序來讀出不同的必需字段,但在我看來,這是對date_time庫的糧食。

任何使用此庫的寫入格式化程序的經驗?或者我做錯了什麼? (*):在我看來,RFC中給出的ABNF只允許一位小數秒,但在同一RFC中的例子有兩位小數秒。這是什麼意思?

+0

您是否嘗試過使用構面?他們似乎很強大,可能能夠做你想做的事(我不知道)。看看這裏:http://stackoverflow.com/questions/327673/convert-wide-character-strings-to-boost-dates/327680#327680 – 2009-01-29 14:59:37

+0

是的,我使用facets。我*希望*使用方面。但對我來說,他們似乎不夠強大。但是,正如你所說,我不知道:) – 2009-01-29 15:01:48

回答

5
  1. 來自RFC的ABNF表示在點後面至少有一個數字,沒有定義的最大值。

  2. 有沒有真正需要的Z,你可以用00:00,而不是,這是可能的方面

  3. 在某些罕見的情況下DATE_TIME會生成一個「Z」。請參閱從升壓(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功能...

和舉例的這

[email protected]:~/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; 
} 
[email protected]:~/store/kodowanie/moje/test$ g++ boost_date_time.cpp && ./a.out 
2009-01-30T12:15:56Z 
[email protected]:~/store/kodowanie/moje/test$ 

使用