1

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

更新: 私は ISO8601 を認識しており、実際にそれを使用して、プロトタイプの YYYY-MM-DD 形式の文字列として日付を格納しました。しかし、さまざまな算術演算では、内部で数値に変換する必要があるため、数値を保存して、表示用に文字列に変換することをお勧めします。この数字の単位は何ですか? また、単位が日よりも正確な場合は、どの時刻を使用する必要がありますか?

4

4 に答える 4

4

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

ISO 8601が興味深いかもしれません。

編集:

しかし、さまざまな算術演算では、内部で数値に変換する必要があるため、数値を保存して、表示用に文字列に変換することをお勧めします。

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

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

于 2008-09-23T14:44:47.017 に答える
0

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

于 2008-09-23T15:27:22.143 に答える
0

ベースをカバーしたい場合は、日付をutcで保存し、iso標準を選択してください。このアプローチは最小限の労力で済み、将来の相互運用の問題からコードを保護します。@skymt ISO 8601が良い選択であることに同意します。

于 2008-09-23T14:59:02.787 に答える
0

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

必ずしもこれを推奨しているわけではありませんが、SQLite DB に日付ではなく時刻を格納する必要があるアプリを作成しました。最初に、Month と Day の 2 つの列を使用しました。Month は 2000 年 1 月からの月数として定義されていました。更新が恐ろしく遅くなります。

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

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

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

于 2008-09-23T23:13:51.037 に答える