質問

使いたいのですが、 date_time 私のアプリケーションで時間を表すためのブースト内のライブラリ。このアプリケーションは Atom フィードを生成します。これにより、指定された形式でタイムスタンプが要求されます。 RFC 3339, 、たとえば、「1990-12-31T23:59:60Z」または「1990-12-31T15:59:60-08:00」です。

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

私が読んでいるのは、 日付時刻入出力ドキュメント 一日中、必要なときに最後に Z を付ける方法がわかりません。また、RFC はオプションの小数秒をサポートしますが、その内の 1 桁のみをサポートします (例:「1990-12-31T23:59:60.5Z」) (*)。これを行う方法もわからないようです。

必要なさまざまなフィールドを読み出す独自の書式設定ルーチンをいつでも作成できますが、それはシステムの粒度に反して機能しているように思えます。 date_time 図書館。

このライブラリ用のフォーマッタを作成した経験はありますか?それとも私が間違ったことをしているのでしょうか?

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

役に立ちましたか?

解決

  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関数にも同様のifがあります...

そしてこれの使用例

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$

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top