Date Type Android

//package divestoclimb.util;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
/**
 * A class of utility functions for outputting date/time information relative
 * to another date/time.
 * TODO: localize. This would be best done by keeping this class's logic Android-
 * independent so it returned some kind of structured format that could build
 * an output string for format strings stored in resources.
 * @author Ben Roberts (divestoclimb@gmail.com)
 */
class FriendlyDate {
  /**
   * Get a string representation of a date as it relates to the current time.
   * @param time The Date object to use to generate the string representation
   * @return A string explaining how long ago or in the future the date is from 
   * now.
   */
  public static String format(Date time) {
    return format(time, new Date());
  }
  // This implementation can't handle leap seconds, but it really doesn't
  // need to be that precise for my purposes
  public static final int MILLIS_PER_SEC=1000;
  public static final int MILLIS_PER_MIN=MILLIS_PER_SEC*60;
  public static final int MILLIS_PER_HR=MILLIS_PER_MIN*60;
  public static final int MILLIS_PER_DAY=MILLIS_PER_HR*24;
  public static final int MILLIS_PER_WEEK=MILLIS_PER_DAY*7;
  /**
   * Get a string representation of a date as it relates to another date.
   * @param time The Date object to use to generate the string representation
   * @param relative The Date object to compare against
   * @return A string explaining how far behind or ahead the date is from relative.
   */
  public static String format(Date time, Date relative) {
    Calendar timeCal = Calendar.getInstance();
    timeCal.setTime(time);
    Calendar relCal = Calendar.getInstance();
    relCal.setTime(relative);
    // Compute the difference between these two dates in milliseconds, but
    // first account for any timezone differences between the two dates.
    long timeMillis = timeCal.getTimeInMillis();
    timeMillis += timeCal.getTimeZone().getOffset(timeMillis);
    long relMillis = relCal.getTimeInMillis();
    relMillis += relCal.getTimeZone().getOffset(relMillis);
    long diff = timeMillis - relMillis;
    String dir = (diff < 0)? "ago":"from now";
    diff = Math.abs(diff);
    if(diff / MILLIS_PER_MIN < 0.2) {
      return "within seconds";
    }
    if(diff / MILLIS_PER_MIN < 0.8) {
      return "less than a minute "+dir;
    }
    if(diff / MILLIS_PER_MIN < 1.5) {
      return "about a minute "+dir;
    }
    if(diff / MILLIS_PER_HR < 0.9) {
      return new Integer(Math.round(diff / MILLIS_PER_MIN)).toString()+" minutes "+dir;
    }
    if(diff / MILLIS_PER_HR < 1.2) {
      return "about an hour "+dir;
    }
    if(diff / MILLIS_PER_HR < 1.9) {
      return "more than an hour "+dir;
    }
    if(diff / MILLIS_PER_DAY < 0.8) {
      return new Integer(Math.round(diff / MILLIS_PER_HR)).toString()+" hours "+dir;
    }
    if(diff / MILLIS_PER_DAY < 1.2) {
      return "about a day "+dir;
    }
    if(diff / MILLIS_PER_DAY < 1.9) {
      return "more than a day "+dir;
    }
    if(diff / MILLIS_PER_WEEK < 1) {
      return new Integer(Math.round(diff / MILLIS_PER_DAY)).toString()+" days "+dir;
    }
    if(diff / MILLIS_PER_WEEK < 1.5) {
      return "about a week "+dir;
    }
    if(diff / MILLIS_PER_WEEK < 7) {
      return new Integer(Math.round(diff / MILLIS_PER_WEEK)).toString()+" weeks "+dir;
    }
    // Just give the raw date
    return DateFormat.getDateInstance().format(time);
  }
}