RFC 3339 に従って boost::date_time-object をフォーマットする方法
-
20-08-2019 - |
質問
使いたいのですが、 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 桁の小数秒が許可されています。それはどういう意味ですか?
解決
RFC の ABNF では、ドットの後に少なくとも 1 桁の数字がなければならないと規定されており、最大値は定義されていません。
Z は実際には必要ありません。代わりに 00:00 を使用できます。これはファセットで可能です
まれに、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$