63

私は常にすべてに UNIX タイムスタンプを使用していますが、もっと良い方法があるかどうか疑問に思っています。

タイムスタンプを保存するために何を使用していますか?その理由は?

4

9 に答える 9

100

どのようにタイムスタンプを保存することを選択しても、地域の解釈の問題と時間のオフセットの問題を回避することが重要です。Unix タイムスタンプは、地域に関係なく同じように解釈され、タイム ゾーンに関係なく同じ時点から計算されます。これは良いことです。

タイムスタンプを 01/02/2008 のようなあいまいな文字列として保存しないように注意してください。これは、ロケールによって 2008 年 1 月 2 日または 2008 年 2 月 1 日と解釈される可能性があるためです。

時間/分/秒を格納する場合、「どの」時間/分/秒が指定されているかを知ることが重要です。タイムゾーン情報を含めることでこれを行うことができます (Unix タイムスタンプは UTC と見なされるため、必要ありません)。

ただし、Unix タイムスタンプは特定の瞬間を一意に表すことができないことに注意してください。UTC にうるう秒がある場合、Unix タイムスタンプは変更されないため、23:59:60 UTC と翌日の 00:00:00 の両方が同じになります。 Unix の表現。したがって、本当に 1 秒以上の解像度が必要な場合は、別の形式を検討してください。

Unix タイムスタンプよりも人間が読みやすい形式のストレージを好む場合は、ISO 8601を検討してください。

物事を単純化するのに役立つテクニックの 1 つは、日付を UTC として保存し、日付をユーザーに表示するときにタイムゾーンまたは DST オフセットのみを適用することです。

于 2008-10-07T14:50:28.357 に答える
31

ログファイルを保存している場合は、ピートの愛のために、人間が読めて字句的にソートできるものにしてください。

たとえば、2008-10-07 09:47:02。

于 2008-10-07T14:48:15.490 に答える
18

32 ビットの Unix タイムスタンプは数年後 (2038 年 1 月)にオーバーフローするため、考慮に値する可能性があります。私は通常、SQL で DATETIME 形式を使用します。これは YYYY-MM-DD HH:MM:SS で、時刻は 24 時間制です。生活を楽にするために、同じ形式のファイルに出力しようとしています。

于 2008-10-07T14:32:49.140 に答える
7

どの時代をどのような解像度で保存する必要がありますか? マイクロ秒が必要な場合、または石器時代の日付が必要な場合は、time_t が最適ではない可能性があります。一般的なビジネス目的では、それはかなり良いです(64ビットを想定)

于 2008-10-07T14:33:09.280 に答える
4

タイムスタンプが必要なものによって異なります。

UNIX タイムスタンプは、2008-12-31T23:59:59Z から 1 秒後の時刻を表すことはできません。unix タイムスタンプで '2009-01-01T09:00:00' - '2008-12-31T09:00:00' を実行すると、結果は正しくありません: これら 2 つの日付の間にうるう秒があり、それらは分離されます。 86401 秒 (UNIX のタイムスタンプでわかるように 86400 秒ではありません)。

それと他のレスポンダーが言ったこと以外は、はい-UNIXタイムスタンプが道です:)

于 2008-10-07T14:43:25.453 に答える
4

データベースでは、夏時間や現在の現地時間が考慮されていないため、タイムスタンプはお勧めできません。MySQL では、時刻として保存し、MySQL の日付と時刻関数を使用して必要な部分を取得するか、他の日付と比較することをお勧めします。

于 2008-10-07T14:44:45.200 に答える
2

1秒未満の精度が必要な場合はtimeval-style(time_t + microseconds)、それ以外の場合はtime_tのみ。64ビット整数値を使用してtime_t*1000000 + usecを格納でき、+/-292、000年以上にわたってオーバーフローが発生しません。

于 2008-10-07T14:34:10.697 に答える
1

UNIX タイムスタンプの 32 ビットの問題は、2038 年以降の将来の日付を入力するユーザーにとってかなり厄介なようです。

MySQL の DATETIME シーケンスを使用するか、日付を BIGINT(8) 符号なし (最大: 18 京) または FLOAT として保存して、大きな数値を入力できるようにします。次に、たとえば PHP の date() 関数を使用することはできません。これは、パラメーターとして整数のみを許可するためです (32 ビット システムによって制限されます)。

私が見つけた解決策は、 PHP 5.2.0関数を使用することです。これが DateTime PHP ソリューションです。

UNIX_TIMESTAMP 形式を変更する必要はありません。タイムスタンプ用の MySQL ストレージとして署名されていない BIGINT(8) がある限り。もう 32 ビット システムに制限されることはありません。

于 2010-10-12T16:06:10.963 に答える
0

タイムスタンプは基本的に次のとおりです。

  • 明確な時点

また、ある時点の解像度は無限であるため、タイムスタンプ形式を選択する際に重要なことは、十分な解像度があるかどうかです。

  • Unix時間は秒単位でのみカウントされます。
  • Ext4にはナノ秒があります
  • Javaにはナノ秒があります

私が持っていたほとんどのアプリケーションでは、ナノ秒で十分でした。そのため、これまでのところ、JavaTimestampの解像度は適切でした。

于 2008-10-07T14:36:52.253 に答える