4

date_timeアプリケーションで時間を表すために、boost でライブラリを使用したいと考えています。このアプリケーションは、 RFC 3339で指定された形式のタイムスタンプを要求する Atom フィードを生成します。 "。

では、この RFC に従って時刻をフォーマットするにはどうすればよいでしょうか?

一日中Date Time Input/Outputのドキュメントを読んでいますが、Z を必要なときに最後に付ける方法がわかりません。また、RFC はオプションの小数秒をサポートしていますが、1 桁のみです (例: "1990-12-31T23:59:60.5Z") (*)。私もこれを行う方法を見つけることができないようです。

date_timeさまざまな必要なフィールドを読み取る独自の書式設定ルーチンをいつでも作成できますが、それはライブラリの粒度に反しているように思えます。

このライブラリのフォーマッタを書いた経験はありますか? それとも私は間違ったことをしていますか?

(*): RFC で指定されている ABNF では 1 桁の小数秒のみが許可されているように思えますが、同じ RFC の例では 2 桁の小数秒が使用されています。それはどういう意味ですか?

4

1 に答える 1

5
  1. RFC の ABNF では、ドットの後に少なくとも 1 桁の数字が必要であり、最大数は定義されていません。

  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 関数の場合も同様です...

そして、これの使用例

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 に答える