2017-01-31 5 views
2

は、私はC++にはかなり新しいですが、今のところこの1つは私の狂わせるtime_pointに変換する方法:C++:JSONからlong値を取得し、セラは、私が持っている質問の束があるので

Iをjsonのレスポンスを無視し、1つのオブジェクトを(タイムスタンプのため)長いものとして解析したい。その後、私は

chrono::system_clock::from_time_t(...); 

を経て長いtime_pointオブジェクトにそれを解析するtpはしたいので、これは私が今のところ得たものである:

auto last_change_date_long = (long long)json_troubleticket["lastChangeDate"].int_value(); 
time_t last_change_date_raw = time_t(last_change_date_long); 
auto last_change_date = chrono::system_clock::from_time_t(last_change_date_raw); 

私はこれを実行する場合、私は値を知っている間、それは(コンパイルしますが、 ためlastChangeDate1480702672000)、それの結果は 2147483647000です...

誰もが何が悪かったのかの提案を持っていますか?

+3

Iはint_value()関数を推測して、それが整数に変換だから値を切り捨てます。 –

+0

あなたは2147483647が0x7FFFFFFF(INT_MAX)であることに気付きましたか? – rustyx

答えて

1

これはそれを行います。system_clockのエポックが指定されていないため、上記はが標準で動作するようにを保証されていないことを

auto i = 1480702672000; 
std::chrono::system_clock::time_point tp{std::chrono::milliseconds{i}}; 

注意を。しかし、すべての実装は現在Unix Timeを使用していますが、私はこの既存のプラクティスを標準化しようとしている間、実装者との非公式の合意を得ています。

jsonが1970-01-01 00:00:00 UTCからのミリ秒数をカウントしていますが、time_tは通常秒数です(標準では指定されていませんが) 。したがって、last_change_date_rawlast_change_date_longから作成すると、ミリ秒が秒に暗黙的に変換されます。これにより、48891年の途中で日付が発生します。from_time_tの実装は、そのことについて驚いている可能性があります(オーバーフロー)。

FWIW、この特定の時点を表し:

2016-12-02 18:17:52.000 UTC 
+0

jsonレスポンスが変更されたので、今すぐテストする機会はありません。 – grumpyshoe

+0

@ grumpyshoe:私はあなたの現在の入力に基づいて、さらにUTC形式のタイムポイントを投稿することができます。遅れ時間は数時間でよい。私はできる限りの努力をします。 –

関連する問題