1 16 package org.joda.time; 17 18 import java.io.Serializable ; 19 import java.util.Comparator ; 20 21 import org.joda.time.convert.ConverterManager; 22 import org.joda.time.convert.InstantConverter; 23 24 48 public class DateTimeComparator implements Comparator , Serializable { 49 50 51 private static final long serialVersionUID = -6097339773320178364L; 52 53 54 private static final DateTimeComparator ALL_INSTANCE = new DateTimeComparator(null, null); 55 56 private static final DateTimeComparator DATE_INSTANCE = new DateTimeComparator(DateTimeFieldType.dayOfYear(), null); 57 58 private static final DateTimeComparator TIME_INSTANCE = new DateTimeComparator(null, DateTimeFieldType.dayOfYear()); 59 60 61 private final DateTimeFieldType iLowerLimit; 62 63 private final DateTimeFieldType iUpperLimit; 64 65 71 public static DateTimeComparator getInstance() { 72 return ALL_INSTANCE; 73 } 74 75 82 public static DateTimeComparator getInstance(DateTimeFieldType lowerLimit) { 83 return getInstance(lowerLimit, null); 84 } 85 86 97 public static DateTimeComparator getInstance(DateTimeFieldType lowerLimit, DateTimeFieldType upperLimit) { 98 if (lowerLimit == null && upperLimit == null) { 99 return ALL_INSTANCE; 100 } 101 if (lowerLimit == DateTimeFieldType.dayOfYear() && upperLimit == null) { 102 return DATE_INSTANCE; 103 } 104 if (lowerLimit == null && upperLimit == DateTimeFieldType.dayOfYear()) { 105 return TIME_INSTANCE; 106 } 107 return new DateTimeComparator(lowerLimit, upperLimit); 108 } 109 110 116 public static DateTimeComparator getDateOnlyInstance() { 117 return DATE_INSTANCE; 118 } 119 120 126 public static DateTimeComparator getTimeOnlyInstance() { 127 return TIME_INSTANCE; 128 } 129 130 136 protected DateTimeComparator(DateTimeFieldType lowerLimit, DateTimeFieldType upperLimit) { 137 super(); 138 iLowerLimit = lowerLimit; 139 iUpperLimit = upperLimit; 140 } 141 142 148 public DateTimeFieldType getLowerLimit() { 149 return iLowerLimit; 150 } 151 152 157 public DateTimeFieldType getUpperLimit() { 158 return iUpperLimit; 159 } 160 161 173 public int compare(Object lhsObj, Object rhsObj) { 174 InstantConverter conv = ConverterManager.getInstance().getInstantConverter(lhsObj); 175 Chronology lhsChrono = conv.getChronology(lhsObj, (Chronology) null); 176 long lhsMillis = conv.getInstantMillis(lhsObj, lhsChrono); 177 178 conv = ConverterManager.getInstance().getInstantConverter(rhsObj); 179 Chronology rhsChrono = conv.getChronology(rhsObj, (Chronology) null); 180 long rhsMillis = conv.getInstantMillis(rhsObj, rhsChrono); 181 182 if (iLowerLimit != null) { 183 lhsMillis = iLowerLimit.getField(lhsChrono).roundFloor(lhsMillis); 184 rhsMillis = iLowerLimit.getField(rhsChrono).roundFloor(rhsMillis); 185 } 186 187 if (iUpperLimit != null) { 188 lhsMillis = iUpperLimit.getField(lhsChrono).remainder(lhsMillis); 189 rhsMillis = iUpperLimit.getField(rhsChrono).remainder(rhsMillis); 190 } 191 192 if (lhsMillis < rhsMillis) { 193 return -1; 194 } else if (lhsMillis > rhsMillis) { 195 return 1; 196 } else { 197 return 0; 198 } 199 } 200 201 207 private Object readResolve() { 208 return getInstance(iLowerLimit, iUpperLimit); 209 } 210 211 217 public boolean equals(Object object) { 218 if (object instanceof DateTimeComparator) { 219 DateTimeComparator other = (DateTimeComparator) object; 220 return (iLowerLimit == other.getLowerLimit() || 221 (iLowerLimit != null && iLowerLimit.equals(other.getLowerLimit()))) && 222 (iUpperLimit == other.getUpperLimit() || 223 (iUpperLimit != null && iUpperLimit.equals(other.getUpperLimit()))); 224 } 225 return false; 226 } 227 228 233 public int hashCode() { 234 return (iLowerLimit == null ? 0 : iLowerLimit.hashCode()) + 235 (123 * (iUpperLimit == null ? 0 : iUpperLimit.hashCode())); 236 } 237 238 243 public String toString() { 244 if (iLowerLimit == iUpperLimit) { 245 return "DateTimeComparator[" 246 + (iLowerLimit == null ? "" : iLowerLimit.getName()) 247 + "]"; 248 } else { 249 return "DateTimeComparator[" 250 + (iLowerLimit == null ? "" : iLowerLimit.getName()) 251 + "-" 252 + (iUpperLimit == null ? "" : iUpperLimit.getName()) 253 + "]"; 254 } 255 } 256 257 } 258 | Popular Tags |