2016-01-28 32 views
7

Z Joda Time, jesteś w stanie zrobić naprawdę fajne rzeczy, na przykład:Czas Joda: DateTimeComparator. Co jest podobnego w Java 8 Time Api?

package temp; 

import org.joda.time.DateTime; 
import org.joda.time.DateTimeComparator; 
import org.joda.time.DateTimeFieldType; 

public class TestDateTimeComparator { 

    public static void main(String[] args) { 

     //Two DateTime instances which have same month, date, and hour 
     //but different year, minutes and seconds 

     DateTime d1 = new DateTime(2001,05,12,7,0,0); 
     DateTime d2 = new DateTime(2014,05,12,7,30,45); 

     //Define the lower limit to be hour and upper limit to be month 
     DateTimeFieldType lowerLimit = DateTimeFieldType.hourOfDay(); 
     DateTimeFieldType upperLimit = DateTimeFieldType.monthOfYear(); 

     //Because of the upper and lower limits , the comparator shall only consider only those sub-elements 
     //within the lower and upper limits i.e.month, day and hour 
     //It shall ignore those sub-elements outside the lower and upper limits: i.e year, minute and second 
     DateTimeComparator dateTimeComparator = DateTimeComparator.getInstance(lowerLimit,upperLimit); 
     int result = dateTimeComparator.compare(d1, d2); 

     switch (result) { 
     case -1: 
      System.out.println("d1 is less than d2"); 
      break; 
     case 0: 
      System.out.println("d1 is equal to d2"); 
      break; 
     case 1: 
      System.out.println("d1 is greater than d2"); 
      break; 

     default: 
      break; 
     } 
    } 
} 

Znalazłem ten przykład here.

Chcę mieć te same kroki, ale z Java Time API, ale niestety nie widzę podobnych komparatorów.

Jak mogę porównać tylko niektóre pola daty i godziny, ale nie tylko z innymi interfejsami Java Time API?

+1

Tworzysz komparatory z 'Comparator.comparing (LocalDateTime :: getHour)', aby porównać tylko godzinę w tym przypadku. Ale żeby porównać wszystkie pola chrono między dwoma polami, mmh ... – Tunaki

Odpowiedz

4

Można replikować niektóre z tych zachowań, nieco bardziej ręcznie, za pomocą ogólnych metod pomocniczych podanych na Comparators.

Zakładając, że import static java.util.Comparators.comparing; możemy zdefiniować komparator na LocalDateTimes że porównuje tylko miesiąc:

Comparator<LocalDateTime> byMonth = comparing(LocalDateTime::getMonth); 

lub taki, który porównuje tylko miesiąc, dzień i godzinę, jak w przykładzie:

Comparator<LocalDateTime> byHourDayMonth = comparing(LocalDateTime::getMonth) // 
    .thenComparing(LocalDateTime::getDayOfMonth) // 
    .thenComparing(LocalDateTime::getHour); 

To pozostawia cię w pozycji ręcznego decydowania o zamówieniu ... nie jest tak automatyczne, ale z nieco bardziej szczegółowym sterowaniem.