2015-03-15 16 views
1

Я надеюсь, что кто-то может мне помочь, который хорошо знает время Джоды. Вот код:Сравнить ДатаВремя объектов по их датам

DateTimeComparator comparator = DateTimeComparator.getInstance(
    DateTimeFieldType.dayOfMonth(), DateTimeFieldType.year()); 

java.sql.Date beforeDate = new java.sql.Date(1372910400000L); // July 4 2013 
java.sql.Date nowDate = new java.sql.Date(System.currentTimeMillis()); 
DateTime beforeDateTime = new DateTime(beforeDate); 
DateTime nowDateTime = new DateTime(nowDate); 

int result = comparator.compare(nowDateTime, beforeDateTime); 
System.out.println(nowDate+" compared to "+beforeDate+" = "+result); 
2015-03-15 compared to 2013-07-04 = -1 

С API Javadocs для сравнения:

Возвращает: нулю, если порядок не имеет значения, отрицательное значение, если lhsObj < rhsObj, положительный значение в противном случае.

Что я делаю неправильно?

ответ

1

Похоже, что вы исключаете год из сравнения, что делает его 03/15 меньше, чем 07/04.
От getInstance(DateTimeFieldType lowerLimit,DateTimeFieldType upperLimit)

Возвращает DateTimeComparator с нижним и верхним пределом. Поля величины меньше нижнего предела исключаются из сравнений. Поля величин, превышающих или равные, до верхнего предела также исключаются из сравнений. Любой предел может быть указан как null, , который указывает неограниченный лимит.

+0

Это объясняет это. Благодарю. –

1

Учитывая текущий пример кода, вы хотите передать null как верхняя граница для DateTimeComparator правильно сравнивать DateTime объекты по дате:

DateTimeComparator.getInstance(DateTimeFieldType.dayOfMonth(), null); 

Это говорит «Compare DateTime объектов на основе день месяца, и все более широкое, чем обработка более точных полей, таких как время как равное ».


Но на самом деле это совсем не то, что вы хотите делать с JodaTime. JodaTime предоставляет несколько разных классов даты и времени для разных операций, и если вы хотите сравнить даты, вы хотите использовать LocalDate. Его .compareTo() работает именно так, как вы ожидали бы:

new LocalDate().compareTo(new LocalDate(2013,7,4)) // returns 1 

Обратите внимание, что java.sql.Date хранит только актуальную информацию, а не времени или информации часового пояса. Создавая объект DateTime, вы искусственно связываете временной и часовой пояс с тем, что было только датой. java.sql.Date Собственный брат в Joda-Time - LocalDate.

Когда вы заботитесь о датах, используйте LocalDate, когда вам нужно время, используйте LocalTime, когда вам нужно время в определенный день, используйте LocalDateTime. Что общего у этих классов, они представляют собой наши абстрактные понятия времени, не момент в истории. Это может показаться странным, но часто это то, что вы действительно хотите. В документации по ключевым понятиям по адресу partials подробно описано это.

Только если вам действительно нужно говорить о моментах в реальном времени, вы должны использовать DateTime и связанные с ним классы. Это на самом деле не так часто, как вы можете подумать с кодом даты/времени.Начните с классов Local* и посмотрите, могут ли они выполнить ваш прецедент.

 Смежные вопросы

  • Нет связанных вопросов^_^