public class DateTest {
  /**
   * const to normalize dates
   */
  private static final int _DAY_NORMALIZATION = 24 * 60 * 60 * 1000;

  /**
   * Get current Calendar
   */
  public static final Calendar getCurrentCalendar() {
    final Calendar locCalToday = Calendar.getInstance();
    return locCalToday;
  }

  /**
   * To force date to 00:00
   */
  @SuppressWarnings("deprecation")
  public static final java.sql.Date normalizeDate(final java.sql.Date parDate) {
    assert( null != parDate );
    parDate.setTime((parDate.getTime() - (parDate.getTimezoneOffset() * 60 * 1000)) / _DAY_NORMALIZATION * _DAY_NORMALIZATION);
    return (parDate);
  }

  /**
   * To force date comparison to 00:00
   */
  @SuppressWarnings("deprecation")
  public static final int normalizedCompare(final java.util.Date parDate1, final java.util.Date parDate2) {
    assert( parDate1 != null );
    assert( parDate2 != null );

    if (true == parDate1 instanceof Timestamp && true == parDate2 instanceof Timestamp) {
      return normalizedCompare((Timestamp) parDate1, (Timestamp) parDate2);
    }
    final long locLongTime1 = (parDate1.getTime() - (parDate1.getTimezoneOffset() * 60 * 1000)) / _DAY_NORMALIZATION * _DAY_NORMALIZATION;
    final long locLongTime2 = (parDate2.getTime() - (parDate2.getTimezoneOffset() * 60 * 1000)) / _DAY_NORMALIZATION * _DAY_NORMALIZATION;
    if (locLongTime1 > locLongTime2) {
      return (1);
    } else if (locLongTime1 < locLongTime2) {
      return (-1);
    } else {
      return (0);
    }
  }

  public static java.sql.Date toSqlDate(final DateTime parDateTime) {
    //return (normalizeDate(new java.sql.Date(parDateTime.getMillis())));
    return new java.sql.Date(parDateTime.getMillis());
  }

  /**
   * Use LocalDates for Days.daysBetween
   * ex: 20/03/08 -> 22/03/08 should be 3
   */  
  public static final int getLocalIntDaysCountBetween(final java.util.Date parFirstDate, final java.util.Date parLastDate) {
    final LocalDate locFirst = new LocalDate(parFirstDate);
    final LocalDate locLast = new LocalDate(parLastDate);
    final Days locDays = Days.daysBetween(locFirst, locLast);
    return (locDays.getDays() + 1);
  }

  /**
   * Use DateTimes for Days.daysBetween
   * ex: 20/03/08 -> 22/03/08 should be 3
   */  
  public static final int getTimeIntDaysCountBetween(final java.util.Date parFirstDate, final java.util.Date parLastDate) {
    final DateTime locFirst = new DateTime(parFirstDate);
    final DateTime locLast = new DateTime(parLastDate);
    final Days locDays = Days.daysBetween(locFirst, locLast);
    return (locDays.getDays() + 1);
  }
  
  @Test
  public void testStupidDatation() {
    final java.sql.Date locDate = toSqlDate(new DateTime(2007, 9, 13, 0, 1, 1, 1));
    final java.sql.Date locEndDate = toSqlDate(new DateTime(2008, 3, 1, 0, 1, 1, 1));
    
    testDatation(locDate, locEndDate);
  }
  
  @Test
  public void testStupidDatation2() {
    final java.sql.Date locDate = toSqlDate(new DateTime(2007, 10, 13, 0, 1, 1, 1));
    final java.sql.Date locEndDate = toSqlDate(new DateTime(2008, 2, 1, 0, 1, 1, 1));
    
    testDatation(locDate, locEndDate);
  }
  
  @Test
  public void testStupidDatation3() {
    final java.sql.Date locDate = toSqlDate(new DateTime(2007, 12, 13, 0, 1, 1, 1));
    final java.sql.Date locEndDate = toSqlDate(new DateTime(2008, 2, 1, 0, 1, 1, 1));
    
    testDatation(locDate, locEndDate);
  }
  
  private final void testDatation(final java.sql.Date locStartDate, final java.sql.Date locEndDate) {
    final int locDayLocalCnt = getLocalIntDaysCountBetween(locStartDate, locEndDate);
    final int locDayDateTimeCnt = getTimeIntDaysCountBetween(locStartDate, locEndDate);
    
    final Calendar locCurrentDate = getCurrentCalendar();
    locCurrentDate.setTime(locStartDate);
    locCurrentDate.add(Calendar.DAY_OF_YEAR, locDayLocalCnt - 1);
    
    assert( 0 == DateUtil.normalizedCompare(locEndDate, locCurrentDate.getTime()) );
    assert( locDayDateTimeCnt == locDayLocalCnt );
  }
}