Поведение 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
поскольку все, что связано с "сейчас", само по себе не является интуитивно понятным.