質問

カレンダーの日付(時間ではなく日のみ)を持つアイテムをsqliteデータベースに保存する必要があります。列内の日付を表す最良の方法は何ですか?妥当な代替手段として、ユリウス日と UNIX 秒が思い浮かびます。日以外の単位を使用する場合、どの時刻に設定する必要がありますか?

アップデート:ISO8601 については認識しており、プロトタイプの日付を YYYY-MM-DD 形式の文字列として保存するために実際に使用しました。ただし、さまざまな算術演算の場合、内部で数値に変換する必要があるため、数値を保存し、表示用に文字列に変換することを好みます。この数値はどのような単位で、どのような起源を持つべきでしょうか。また、単位が日よりも正確である場合は、どの時刻を使用する必要がありますか?

役に立ちましたか?

解決

外部ツールまたはライブラリに日付を渡すことが予想される場合は、それが期待する形式を使用する必要があります。Unix 時間はデジタルホログラフィーの共通語のようです。そのため、外部の状況によって選択できない場合は、Unix 時間をデフォルトとして使用するのが良いでしょう。

ISO8601 興味があるかもしれません。

編集:

ただし、さまざまな算術演算の場合、内部で数値に変換する必要があるため、数値を保存し、表示用に文字列に変換することを好みます。

ああ、それは理にかなっています。お使いの環境 (.NET?パイソン?C++?) には時間処理ツールがあるため、ネイティブの単位とエポックを使用するのが最善です。これらの日付操作関数をすべて書き直す理由はありません。彼らは見た目よりもトリッキーです。それ以外の場合は、アプリケーションの妥当なエポック以降のローカル (グレゴリオ暦?) カレンダーの日数を使用します。寛大になってください。予想よりも早い日付を突然処理する必要が生じたときに、逆 Y2K バグが発生することは望ましくありません。

時間帯は完全に好みの問題です。午前 0 時が最もクリーンな選択 (時、分、秒のフィールドがすべてゼロ) のように見えますが、ユーザーには決して届かないため、実用的な意味はありません。実際、イースターエッグにはぴったりの場所でしょう。

他のヒント

基本をカバーしたい場合は、日付を UTC で保存し、ISO 標準を選択してください。このアプローチでは最小限の労力で済むため、将来の相互運用の問題からコードを保護できます。@skymt に同意します ISO8601 良い選択です。

C++ を使用している場合は、boost::date_time を検討する価値があります。

「最良」はほぼ完全に、日付がどこから来たのか (NSDate オブジェクト、一部の XML フィード)、および日付がどのように操作されるか (単にそのまま保存するか、そのまま保存するか) によって決まります。「までの日数」などの算術を実行します)。

必ずしもこれをお勧めするわけではありませんが、SQLite DB に時刻ではなく日付を保存する必要があるアプリを作成しました。最初は、Month と Day の 2 つの列を使用しました。Month は、2000 年 1 月からの月数として定義されました。日付ごとに 1 行を強制する必要があったので、これら 2 つの列にわたって UNIQUE インデックスを定義しましたが、更新がひどく遅くなることが判明しました。

2 回目の試行では、同様のスキームを使用しましたが、下位 5 ビットを日、残りの上位ビットを月に使用して、日付を 1 つの数値にエンコードしました (これも 2000 年 1 月以降)。変換関数は次のとおりです。

Date = (Month << 5) | Day
Month = Date >> 5
Day = 0x1F & Date

このスキームにより、日付の数値順序が維持され、日付をコンポーネントに簡単に分割できるようになります。私のアプリではデータを毎月のチャンクに保存していたため、これは理にかなっていました。日付を指定して次の日付を見つけたい場合、日付 + 1 は有効な日付ではない可能性があるため、このスキームは最適ではない可能性があります。

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