public boolean equals(Object obj) {
   if (!(obj instanceof CalendarDate)) {
     return false;
   }
   CalendarDate that = (CalendarDate) obj;
   if (isNormalized() != that.isNormalized()) {
     return false;
   }
   boolean hasZone = zoneinfo != null;
   boolean thatHasZone = that.zoneinfo != null;
   if (hasZone != thatHasZone) {
     return false;
   }
   if (hasZone && !zoneinfo.equals(that.zoneinfo)) {
     return false;
   }
   return (year == that.year
       && month == that.month
       && dayOfMonth == that.dayOfMonth
       && hours == that.hours
       && minutes == that.minutes
       && seconds == that.seconds
       && millis == that.millis
       && zoneOffset == that.zoneOffset);
 }
 /**
  * Returns whether the specified date is the same date of this <code>CalendarDate</code>. The time
  * of the day fields are ignored for the comparison.
  */
 public boolean isSameDate(CalendarDate date) {
   return getDayOfWeek() == date.getDayOfWeek()
       && getMonth() == date.getMonth()
       && getYear() == date.getYear();
 }