1

現在の時刻を文字列としてデータベースに保存する必要があります。時間は異なるタイムゾーンにある可能性があるため、Java SE 8 の新しい ZonedDateTime クラスの使用を検討しています。

toString() メソッドが自動的に出力することに気付きました:

2016-04-15T17:40:49.305-05:00[America/Chicago]

これも ZonedDateTime.parse() で読み取れるようで、正しい値に変換されます。

これらの値を保存するだけで、値をユーザーが読み取り可能な形式に変換する必要がない場合、適切なタイムゾーンでデータを正確に保存するために必要なことはこれだけですか? たとえば、toString() 表現を格納することによって 2 つの ZonedDateTimes を SQL データベースに挿入し、後で ZonedDateTime.parse() を使用してこれらの時刻を読み取った場合、isAfter() や isBefore() などは正常に動作すると期待できますか?大丈夫?

または、その間のステップがありませんか?Java 7 でタイムゾーンを理解しようとした後、これはほとんど簡単すぎるように感じます。

4

2 に答える 2

2

toString()一般的に言えば、アプリケーション内のクラス の表現の解析に依存することは避けます。toString()クラスの人間が読めるバージョンを提供することを意図しているため、リリースごとに変更される可能性があります。

形式を強制的に期待どおりのものにすることをお勧めします。たとえば、次を適用します。

String toStoreInDb = DateTimeFormatter.ISO_ZONED_DATE_TIME.format(zonedDateTime);
...
ZonedDateTime fromDb = 
ZonedDateTime.parse(stringFromDb, DateTimeFormatter.ISO_ZONED_DATE_TIME);

このようにして、アプリケーションは変更に抵抗しますtoString()。さらに、このバグを見てください: ZonedDateTime.parse() のバグ

于 2017-05-11T21:31:46.060 に答える
1

はい、それは日付を正確に保存し、.parse() メソッドを使用すると、ZoneDateTime の他のメソッドを使用できるようになります。ただし、データベースで並べ替え関数を使用できるようにする場合は、ZonedDateTime を手動でタイムスタンプに変換するか、ORM の機能を使用してそれを行う必要があります。

于 2016-10-14T13:02:18.197 に答える