18

文字列値として2つの日付を取得していて、開始時刻が終了時刻よりも早いことを確認したかったのです。次のように、を使用して日付に変換せずに、そのまま比較しますSimpleDateFormat

String startTime = "2013-01-02 14:25:56";
String endTime   = "2013-01-02 14:30:56";

if(endTime.compareTo(startTime) > 0){
    System.out.println("End time is greater than start time");
}

それらを日付に変換して比較することは本当に必要ですか?私は何かが恋しいですか?私は正しいことをしていますか?

4

10 に答える 10

17

欠落しているのは、日付が実際に適切にフォーマットされているかどうかの検証です。

日付が毎回表示したとおりにフォーマットされている場合、これは機能します。異なる可能性がある場合は、結果のDateオブジェクトを解析して比較すると、少なくともある程度のチェックが追加されます。

たとえば、2の日付のいずれかがたまたまフォーマットされている2013.01.02 14:30:56か、フォーマットされていない日付が含まれているyesterday場合、コードは黙って何らかの順序(実際の順序とはほとんど関係ありません)を想定して続行します。何をすべきかは、いくつかの期待が満たされていないことをユーザー(またはログファイルなど)に通知することです。

于 2013-01-02T15:59:45.490 に答える
11

それらを日付に変換して比較することは本当に必要ですか?

タイムゾーンを含める必要がなく、常にこの形式を使用できるようにすることができる場合は、辞書式順序が機能します。

私は何かが恋しいですか?

柔軟性が失われます

私は正しいことをしていますか?

それは視点に依存します。私は特殊な検索エンジンで同様のものを使用します(パフォーマンス上の理由のみ)。通常、私はDateに変換し、これらのオブジェクトを比較します。

于 2013-01-02T16:03:20.843 に答える
8

それは良い習慣ではなく、コードの臭いです。

セマンティックが正しく、読み取り可能なコードが失われます。(そして、拡張性、タイムゾーン、およびその他の正しいことは、すでに言われています)

2つStringのを比較したくない、2を比較したいDateので、これを実行して、2つのDateオブジェクトを比較します。

単体テストを作成して比較メソッドをテストする場合、日付に変換せずに、すべての場合に2つの「文字列」日付を正しく比較するメソッドを作成することはできません。

于 2013-01-02T16:06:47.023 に答える
7

次の3つの条件が満たされている場合にのみ、適切に解析せずに日時を比較できます。

  1. 日時は常に同じ形式です。

    • 同数のフィールド
    • フィールドは純粋に数値でなければなりません。(文字列の比較:Jan> AprilWed> Thu)。
    • フィールドのサイズは固定されています(必要に応じて0が埋め込まれます)。たとえば、適切なパディングがないと、10:01<になります1:01:数字よりもASCIIコードが大きくなります)。
    • 非数値部分(セパレーターを含む)は、間隔まで同じである必要があります。
  2. フィールドは、ユニットのサイズの降順で並べられています(右側に大きいユニット、左側に小さいユニット)。例えば:YEAR-MONTH-DAY HOUR:MINUTE:SECOND.MILISECOND

  3. それらは同じタイムゾーンにある必要があります。タイムゾーン情報が存在する場合は、同じ表示にする必要がありSGTます(UTC+8現在は同等ですが、文字列の比較ではこれについてはわかりません)。上記のあいまいな条件「同じタイムゾーン」は、等しいものを比較するには十分ですが、大きい/小さいものを比較するには、比較する2つの日付間でタイムゾーンに変化があってはなりません。

于 2013-01-02T16:06:10.550 に答える
2

どうですか

  "999-01-01 00:00:00"

"10000-01-01 00:00:00"
于 2013-01-02T16:03:38.050 に答える
2

Javaであろうとなかろうと、最初に次の質問をする必要があります。

  • 時間と日数を比較する必要がありますか?
  • TimeZoneを確認する必要がありますか、それともすべてのユーザーが同じタイムゾーンにいますか(または気にしません)

日を比較する必要がある場合は、「YYYY-MM-dd」形式の文字列が完璧で効率的です。

'2018-01-23' < '2018-03-21'。常に、どの言語でも。

時間がある場合とタイムゾーンがない場合は、データベースに「YYYY-MM-ddHH:mm:ss」として時間を保存することもできます。

Timezoneを使用する場合は、プラットフォーム(コードとデータベース)を学習し、UTCとは何かを理解する必要があります(幸運を祈ります!)。

( http://xkcd.com/1179/のCC BY-NC 2.5ライセンスで使用されます。)

于 2019-02-19T09:12:47.170 に答える
1

少し安全にするために、最初に日付に変換することをお勧めしますが、形式(またはタイムゾーンなど)が変更されないことが確実である限り、日付を比較してその文字列の形式を比較する必要があります同等である。

于 2013-01-02T16:00:53.757 に答える
1

yyyy-mm-dd hh:ii:ssを文字列として比較して正しい結果を得ることができるため、アプローチは適切です。他の日付形式は失敗します。

別のオプションは、このスタックオーバーフローの質問を読むことです

Javaで日付を比較する方法は?

文字列を解析して、日付またはカレンダーオブジェクトを作成する必要があります。これは、実行する内容に応じて異なります。以下は、私が役立つと思うものです。

http://www.mkyong.com/java/java-how-to-get-current-date-time-date-and-calender/

于 2013-01-02T16:03:14.633 に答える
1

はい、文字列を日付に変換して比較することをお勧めします。

  1. それはそれらが実際に有効な日付であることを保証するので、2012年20月20日ではありません。
  2. 変換が完了すると、1つの数値比較のみが残ります。
  3. さまざまな形式の日付を比較するときに、大きな柔軟性が得られます。
  4. 別の方法は、各数値を解析して他の数値と比較するコードを作成することです。これは同じくらいの作業です。
于 2013-01-02T16:03:28.183 に答える
0

私の日付は文字列ベースのソースからのものであり、タイムゾーン情報やその他の複雑さを伴わずに常にYYYY-MM-DDの形式になっています。したがって、日付の長いリストを比較する場合、最初に日付オブジェクトに変換するよりも、文字列として比較する方が簡単で効率的です。

コードでこの間違いを犯すまで、これは決して問題ではありませんでした。

boolean past = (dateStart.compareTo(now) == -1);

compareToは値を-1、0、または1として返すだけではないため、これはいくつかの誤った結果をもたらしていました。これは単純な修正でした。

boolean past = (dateStart.compareTo(now) < 0);

これは、私が間違っていることを理解しようとしたときに見つけたSOの質問の1つであるため、ここにこの落とし穴を含めています。

于 2018-02-07T00:50:26.197 に答える