Поведение DateTimeComparator несовместимо с его Javadoc

Я хотел сравнить только даты двух org.joda.time.DateTime значения, поэтому я использовал DateTimeComparator.getDateOnlyInstance() - но я видел какое-то поведение, которое не совпадает с его javadoc. Интересно, кто-то здесь может это объяснить? Javadoc DateTimeComparator говорит следующее о его параметрах и возвращаемом значении:

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, Контракт этого метода, как это определено в javadoc интерфейса Comparator, говорит, что возвращаемое значение должно быть 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 означает, и нужно сравнивать только дату):

comparisonResult = -1

=== Дополнительная информация после прочтения первого ответа и еще нескольких экспериментов:

Согласился что null означает "сейчас в системном часовом поясе по умолчанию", но если вы сравниваете значение даты и времени всего DateTime.now(DateTimeZone.UTC) а также null, они одинаковы (см. дополнительный код ниже). Это кажется мне правильным, потому что сейчас в любом часовом поясе это одно и то же мгновение. Однако отдельные поля могут быть разными. Итак, вчера я сравнивал дату только тогда, когда дата отличалась в UTC и PST (мой системный часовой пояс по умолчанию), я получил ожидаемый результат = 1, потому что дата в UTC была больше. В настоящее время, хотя даты одинаковы в обеих зонах, но компаратор, похоже, говорит, что дата в 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

1 ответ

Ответ на вопрос 1:

Я согласен, что фраза "ноль, если порядок не имеет значения" сбивает с толку. Лучше заменить его на "ноль, если временные объекты равны" или аналогичен. Вы можете опубликовать вопрос или даже запрос на размещение в Github-местоположении Joda-Time, чтобы предложить предпочтительное описание.

Ответ на вопрос 2:

Null Значение не означает просто сейчас, но теперь в системном часовом поясе по умолчанию. Так что работает только следующий код:

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

В любом случае, я настоятельно рекомендую не использовать эту нулевую "функцию", а указывать явные ссылки на часовые пояса, поскольку null поскольку все, что связано с "сейчас", само по себе не является интуитивно понятным.

Другие вопросы по тегам