2016-01-28 2 views
7

Mit Joda Zeit, sind Sie in der Lage ein wirklich coolen Dinge zu tun, zum Beispiel:Joda-Zeit: DateTimeComparator. Was ist ähnlich in 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; 
     } 
    } 
} 

ich here dieses Beispiel gefunden.

Ich möchte die gleichen Schritte haben, aber mit Java Time API, aber leider sehe ich keine ähnlichen Komparatoren.

Wie kann ich nur bestimmte Datums- und Zeitfelder, aber nicht andere mit Java Time API vergleichen?

+1

Sie erstellen Komparatoren mit 'Comparator.comparing (LocalDateTime :: getHour)', um in diesem Fall nur die Stunde zu vergleichen. Aber um alle Chrono-Felder zwischen zwei Feldern zu vergleichen, mmh ... – Tunaki

Antwort

4

Sie können etwas dieses Verhaltens, etwas mehr manuell, mit den allgemeinen Hilfsmethoden, die auf Comparators bereitgestellt werden, replizieren.

Unter der Annahme, dass wir import static java.util.Comparators.comparing; wir einen Komparator auf LocalDateTimes definieren kann, dass nur der Monat vergleicht:

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

oder eine, die nur den Monat, Tag und Stunde vergleicht, wie in Ihrem Beispiel:

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

Dies lässt Sie in der Position der manuellen Entscheidung der Bestellung ... nicht ganz so automatisch, aber mit etwas feineren Kontrolle.

Verwandte Themen