8

次のような 2 つの日付があるとします。

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm:ss").withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTime firstDate = formatter.parseDateTime("16-Feb-2012 12:03:45");
DateTime secondDate = formatter.parseDateTime("17-Feb-2013 12:03:45");

firstDateこれら 2 つの日付を比較して、 が より早いか、遅いか、等しいかを確認したいと思いsecondDateます。

以下を試すことができました。

System.out.println("firstDate = "+firstDate+"\nsecondDate = "+secondDate+"\ncomparison = "+firstDate.isBefore(secondDate));
System.out.println("firstDate = "+firstDate+"\nsecondDate = "+secondDate+"\ncomparison = "+firstDate.isAfter(secondDate));
System.out.println("firstDate = "+firstDate+"\nsecondDate = "+secondDate+"\ncomparison = "+firstDate.equals(secondDate));

このコードによって生成されるものは、まさに私が望むものです。

次の出力が生成されます。

firstDate = 2012-02-16T12:03:45.000+05:30
secondDate = 2013-02-17T12:03:45.000+05:30
comparison = true

firstDate = 2012-02-16T12:03:45.000+05:30
secondDate = 2013-02-17T12:03:45.000+05:30
comparison = false

firstDate = 2012-02-16T12:03:45.000+05:30
secondDate = 2013-02-17T12:03:45.000+05:30
comparison = false

これらの日付の秒とミリ秒の部分は無視する必要があります。withSecondOfMinute(0)次のようなandwithMillis(0)メソッドを使用しようとしました。

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm:ss").withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTime firstDate = formatter.parseDateTime("16-Feb-2012 12:03:45").withSecondOfMinute(0).withMillis(0);
DateTime secondDate = formatter.parseDateTime("17-Feb-2013 12:03:45").withSecondOfMinute(0).withMillis(0);        

しかし、次の出力が得られました。

firstDate = 1970-01-01T05:30:00.000+05:30
secondDate = 1970-01-01T05:30:00.000+05:30
comparison = false

firstDate = 1970-01-01T05:30:00.000+05:30
secondDate = 1970-01-01T05:30:00.000+05:30
comparison = false

firstDate = 1970-01-01T05:30:00.000+05:30
secondDate = 1970-01-01T05:30:00.000+05:30
comparison = true

メソッドのドキュメントにwithSecondOfMinute()説明があります。

分フィールドの秒を更新して、この日時のコピーを返します。DateTime は不変であるため、set メソッドはありません。代わりに、このメソッドは、分の秒の値が変更された新しいインスタンスを返します。

そして、メソッドのドキュメントはwithMillis()言います。

この日時のコピーを異なるミリ秒で返します。返されるオブジェクトは、新しいインスタンスまたは this のいずれかになります。ミリ秒のみが変更され、年表とタイムゾーンは保持されます。

DateTimeComparator.getDateOnlyInstance()時間部分を完全に無視して日付を比較することは、次のように大まかに使用して簡単に行うことができます。

if(DateTimeComparator.getDateOnlyInstance().compare(firstDate, secondDate)==0){}
if(DateTimeComparator.getDateOnlyInstance().compare(firstDate, secondDate)<0){}
if(DateTimeComparator.getDateOnlyInstance().compare(firstDate, secondDate)>0){}

DateTime特定の瞬間(この場合は秒とミリ秒)を無視して2つの日付を比較する方法は?

4

3 に答える 3

9

別のアプローチは、下限として分を使用してDateTimeComparatorを作成することです。

DateTimeComparator comparator = DateTimeComparator.getInstance(
         DateTimeFieldType.minuteOfHour());

これは、比較されているオブジェクトの2番目とミリ秒の部分を無視します。

于 2013-02-18T23:58:56.623 に答える
8

DateTime#withMillisOfSecond()の代わりに使用したいと思いますDateTime#withMillis()

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm:ss").withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTime firstDate = formatter.parseDateTime("16-Feb-2012 12:03:45").withSecondOfMinute(0).withMillisOfSecond(0);
DateTime secondDate = formatter.parseDateTime("17-Feb-2013 12:03:45").withSecondOfMinute(0).withMillisOfSecond(0);

に設定DateTime#withMillis()すると0、両方の日付が にリセットされるため、電話で1/1/1970問い合わせることができます。trueequals

同様に、 に設定DateTime#withMillisOfDay()する0と、時間が に設定されmidnightます。

于 2013-02-18T23:35:02.737 に答える