2

org.joda.time.DateTime2 つの値の日付のみを比較したかったので、 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 matterComparator インターフェースの 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
4

1 に答える 1

2

質問 1 への回答:

「順序が重要でない場合はゼロ」というフレーズが紛らわしいことに同意します。「時間オブジェクトが等しい場合はゼロ」などに置き換えたほうがよい場合があります。Joda-Time の github-location に問題やプル リクエストを投稿して、好みの説明を提案できます。

質問 2 への回答:

Nullvalue は単に今を意味するのではなく、デフォルトのシステム タイムゾーンで現在を意味します。したがって、次のコードのみが機能します。

DateTime nowDefaultZone = DateTime.now(DateTimeZone.getDefault());
int comparisonResult = 
  DateTimeComparator.getDateOnlyInstance().compare(null, nowDefaultZone);
System.out.println("comparisonResult = " + comparisonResult); // 0

とにかく、このヌル「機能」を使用せずに明示的なタイムゾーン参照を指定することを強くお勧めしますnull。「現在」に関連するものとして解釈すること自体は直感的ではないためです。

于 2016-02-10T15:51:07.137 に答える