2011-01-26 18 views
1

Boostの日付時間ライブラリを使用してカスタム形式で日付/時刻文字列を解析しようとしています。私が使用しようとしている形式は、Posixのタイムゾーンの記述文字列を含んでいるので珍しいです。ライブラリのdocsには、Posixタイムゾーン文字列を処理する入力と出力の両方に使用できるフラグ(%ZP)があります。私が解析しようとしているのはWebブラウザからのもので、ゾーン文字列で指定された変換を実行するためにJSを記述し、UTCでサーバーに送信するのではなく、サーバー側で行うブーストはこれを本当に簡単に行うべきです)。明らかに私が働いていれば、私はここに投稿していないでしょう。このコードは、 "ソースタイプの値をターゲットとして解釈できませんでした"の値を持つboost::bad_lexical_castをスローします。あなたは"%Y-%m-%dT%H:%M:%S%F;"でフォーマット文字列を置換する場合タイムゾーン文字列を含むBoost datetimeライブラリを使用した解析エラー

using namespace boost::posix_time; 
using namespace boost::local_time; 
using namespace boost::gregorian; 

std::istringstream ss("1989-11-09T15:30:42.005;PST-8PDT,M3.2.0,M11.1.0"); 
ss.exceptions(std::ios_base::failbit); 
local_time_input_facet* facet = new local_time_input_facet("%Y-%m-%dT%H:%M:%S%F;%ZP"); 
ss.imbue(std::locale(ss.getloc(), facet)); 

local_date_time ldt(not_a_date_time); 

ss >> ldt; // do the parse 

std::cout << ldt.to_string(); 

はしかし、パースは(もちろん、それは間違ったタイムゾーンの値を出力)うまく成功します。

私が間違っていることを知っていますか? %ZPフラグのドキュメントには例がないので、どのように使用されるべきかわかりません。

+0

これはうまくいきましたか? – Nim

答えて

1

フォーマット文字列は、次のようになります。%Y-%m-%dT%H:%M:%s *;%ZP%s *は秒数と小数第2秒に一致します。

1989-Nov-09 15:30:42.005000 ST

ないことがSTいうより言うなぜあなたが変更した場合、しかし、タイムゾーン情報は、正しく解析されますないことを確認:この変更により、上記のコードは、しかし、私が手に出力されbizarely、実行されますたとえば、Nov-01に日付を設定すると、PDTと表示されます。

EDIT:タイムゾーンオブジェクトの説明はhereです。

std::istringstream ss("1989-10-16T15:30:42.005 PST-8PDT,M3.2.0,M10.2.0"); 

と変更:このいじりから、それはなるように、元の文字列から削除し、解析エラーが;の存在によって引き起こされることが表示されます


さて、フォーマット文字列に:

local_time_input_facet* facet = new local_time_input_facet("%Y-%m-%d %H:%M:%s %ZP"); 

が正しく報告されます。

1989-Oct-16 15:30:42.005000 PST 

あなたが再び入力文字列を変更する場合:

std::istringstream ss("1989-10-16T15:30:42.005 PST-8PDT,M3.2.0,M11.1.0"); 

出力は再び正しいです:

1989-Oct-16 15:30:42.005000 PDT 

これは確かに、文字列に埋め込まれたタイムゾーン情報を尊重されていることを私に伝えます。..興味深いのは、;があれば、それはなぜbarfingですか?

さらに更新すると、入力文字列には英数字、セット.:-,の文字と小数点以下のスペースしか含まれていないように見えます。つまり、上記のもの以外の文字でタイムゾーン情報を区切ることはできません。 (それは網羅的ではない、それらのすべてをテストする時間がない!)

+0

私はあなたの答えを読むと非常に興奮しましたが、私はそれを試みましたが、それは私のためには機能しません。私は同じ結果を持つ '%s * 'の代わりに'%s'だけを使ってみました。あなたは '%s *'に関するドキュメントを誤解していると思います。アスタリスクはBoost特有の動作であることを示す脚注を示します(これらのフォーマット指定子の大部分は 'strftime()'と同じです)。どのバージョンのBoostを使用していますか?私は1.40.0を使用しています。 – rmeador

+0

申し訳ありませんが、私はこれを見て2amだったと思います。私は1.4.5だけでテストして、更新を参照してください... – Nim

+0

これは魅力的です...私はすでに別の方法で問題を取り組んだが、私はあなたの答えを受け入れるでしょうそれを自分で確認しました。あまりにもドキュメントは文字の制限について言及していない悪いです!ありがとう。 – rmeador

関連する問題