2009-01-29 76 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$ 

使用