2

正確なタイムスタンプのセットを(ミリ秒単位の精度で) 効率的かつ正確な方法で保存する必要があるカスタム データ型を作成しています。私はタイムスタンプ処理の複雑さに特に慣れていないので、ここで賢明なアドバイスを求めたいと思いました.

多くのオプションが表示されます:

  • Instantタイムスタンプごとに Jodaを保存します。
  • DateTimeタイムスタンプごとに Jodaを保存します。
  • データ型に対して 1つの JodaDateTimeオブジェクトを 1 回格納longし、他のすべてのタイムスタンプに対してメインからのオフセットを設定します。DateTime
  • すべてのタイムスタンプをlong固定小数点へのオフセットとして表現します (例: 1970-01-01T00:00:00Z の Unix エポック)
  • ……他の組み合わせ……

質問:

  • 一連のタイムスタンプを保存する最良の方法は何ですか?
  • 主なトレードオフは何ですか?
  • 注意すべき落とし穴はありますか?
4

1 に答える 1

3

それぞれのストレージ オプションは理にかなっています。すべてのオプションが実際のインスタントであり、ローカルの日時ではありません (たとえば、タイム ゾーンなし)。

カスタム クラスは実際にはそのインターフェイスによって定義されるため、 long (エポック オフセット) を格納することを選択した場合は、シーケンスから値を取得するためのインターフェイス メソッドをいつでも提供できます (「デルタ」または間隔などの他のものを想定しています)。必要に応じて、人間が読める日時と期間で期間、またはジョーダ語の期間)。

あなたがトレードオフを含む多くの質問をしたので、ここに私が提供できるものがあります:

  • long のシーケンスを格納すると、最もスペース効率が高くなります。
  • インターフェイス メソッドが日時を返したい場合は、long を DateTime コンストラクタに渡すだけなので、long は思ったほど悪くはありません。
  • インスタントは long の薄いラッパーであり、持続時間を追加したり、インスタントから持続時間を計算したりする必要がある場合に便利なメソッドを提供します。long に対して独自の計算を行ってから、それらの周りに DateTime、Period、または Duration を構築する場合よりも、コードが少し見栄えがする場合があります。
  • 過剰なストレージ要件がなく、実際の日付と時刻がカスタム データ型のクライアントにとって重要な場合は、DateTimes が最適です。ユーザーは、タイムスタンプがアメリカ/ロサンゼルスのタイム ゾーンで 10 月 10 日の 16:22 であることを気にしますか? それとも、タイムスタンプ間の期間がすべて重要ですか?
  • 日時またはインスタントとオフセットの配列を格納することは、2 つの概念が関係しているため、面倒な実装のように見えます。単一のインスタント/日付時刻のシーケンスのみを保存し、期間を混在させない方がはるかに理にかなっていると思います。期間を扱う必要がある場合は、インターフェイス メソッドで計算するだけです。

long を格納していて、クライアントが datetime で考える必要がある場合、注意すべき唯一の落とし穴は、タイム ゾーンの処理に関するものです。

トレードオフに関して言えば、原始的な long がスペースを節約することだけが実際にわかります。DateTimes はオブジェクトであり、ヒープの割り当てと割り当て解除がすべて行われるため、ほんのわずかな時間を推測します。ただし、メモリの制約が厳しい場合を除き、DateTimes を格納するのが最善の方法だと思います。Joda-Time は、すべてのタイム ゾーン管理を行うことができます。解析とフォーマットのルーチンは簡単で、スレッドセーフです。便利なメソッドがたくさん用意されています。また、datetimes から long への独自の変換を行う必要はありません。ロングを保管することは、私には時期尚早の最適化のようにしか思えません。奇妙なことに、FWIW では、Python の datetime オブジェクトはデフォルトでタイムゾーンに対応するのではなく単純なので、おそらく Python でそれを行うでしょう。

于 2013-10-11T05:18:45.167 に答える