org.joda.time.DateTime
2 つの値の日付のみを比較したかったので、 DateTimeComparator.getDateOnlyInstance()
- を使用していましたが、javadoc と一致しない動作が見られました。ここの誰かがそれを説明できるのだろうか。DateTimeComparatorのjavadoc は、そのパラメーターと戻り値について次のように述べています。
Parameters:
lhsObj - the first object, logically on the left of a < comparison, null means now
rhsObj - the second object, logically on the right of a < comparison, null means now
Returns:
zero if order does not matter, negative value if lhsObj < rhsObj, positive value otherwise.
質問 1:が返されるのはなぜですかzero if order does not matter
。Comparator インターフェースの javadocで定義されているこのメソッドの契約では、戻り値はa negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second
. (order does not matter
オブジェクトが等しいという著者の言い方かもしれませんが、それを言うのは紛らわしい方法です。)
質問 2:次のコードとその出力を検討してください。
public static void main(String[] args) {
DateTime nowUTC = DateTime.now(DateTimeZone.UTC);
int comparisonResult = DateTimeComparator.getDateOnlyInstance().compare(null, nowUTC);
System.out.println("comparisonResult = " + comparisonResult);
}
出力 ( null は nowを意味し、日付のみを比較する必要があることに注意してください):
comparisonResult = -1
=== 最初の回答といくつかの実験を読んだ後の追加情報:
「現在、デフォルトのシステムタイムゾーン」を意味することに同意しnull
ましたが、 と の日付時刻値全体を比較するDateTime.now(DateTimeZone.UTC)
とnull
、それらは同じです (以下の追加コードを参照)。今はどのタイムゾーンでも同じ瞬間なので、それは私には正しいようです。ただし、個々のフィールドは異なる場合があります。そのため、昨日、日付が UTC と PST (私のデフォルトのシステム タイムゾーン) で異なる場合にのみ日付を比較しました。UTC の日付の方が大きかったため、期待される結果 = 1 が得られました。現時点では、日付は両方のゾーンで同じですが、コンパレーターは、UTC の日付が PST の日付よりも小さいと言っているようですが、これは決してあり得ません。
テストコード:
public static void main(String[] args) {
System.out.println("Printing DateTime.now(DateTimeZone.UTC), and (DateTime)null using formatter.withZoneUTC()");
System.out.println("\tDateTime.now(DateTimeZone.UTC)\t= " +
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss-z").withZoneUTC().print(DateTime.now(DateTimeZone.UTC)));
System.out.println("\t(DateTime)null\t\t\t= " +
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss-z").withZoneUTC().print((DateTime)null));
System.out.println();
System.out.println("Printing (DateTime)null using formatter with default timezone");
System.out.println("\t(DateTime)null\t\t\t= " + DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss-z").print((DateTime)null));
System.out.println();
System.out.println("Comparing date only of DateTime.now(DateTimeZone.UTC) (LHS) and null (RHS)");
int dateOnlyComparisonResult = DateTimeComparator.getDateOnlyInstance().compare(DateTime.now(DateTimeZone.UTC), null);
System.out.println("\tdateOnlyComparisonResult\t= " + dateOnlyComparisonResult);
System.out.println();
System.out.println("Comparing entire date time value of DateTime.now(DateTimeZone.UTC) and null");
int instantComparisonResult = DateTimeComparator.getInstance().compare(DateTime.now(DateTimeZone.UTC), null);
System.out.println("\tinstantComparisonResult\t\t= " + instantComparisonResult);
}
出力:
Printing DateTime.now(DateTimeZone.UTC), and (DateTime)null using formatter.withZoneUTC()
DateTime.now(DateTimeZone.UTC) = 2016-02-11T19:26:07-UTC
(DateTime)null = 2016-02-11T19:26:08-UTC
Printing (DateTime)null using formatter with default timezone
(DateTime)null = 2016-02-11T11:26:08-PST
Comparing date only of DateTime.now(DateTimeZone.UTC) (LHS) and null (RHS)
dateOnlyComparisonResult = -1
Comparing entire date time value of DateTime.now(DateTimeZone.UTC) and null
instantComparisonResult = 0