@Override
  public boolean equals(Object other) {
    if (this == other) return true;
    if (!(other instanceof TimeLength)) return false;

    TimeLength that = (TimeLength) other;

    return toMilliseconds() == that.toMilliseconds();
  }
/** @author Shihai.Fu */
public final class TimeLength {
  public static final TimeLength ZERO = TimeLength.seconds(0);

  public static TimeLength days(long days) {
    return new TimeLength(days, TimeUnit.DAYS);
  }

  public static TimeLength hours(long hours) {
    return new TimeLength(hours, TimeUnit.HOURS);
  }

  public static TimeLength minutes(long minutes) {
    return new TimeLength(minutes, TimeUnit.MINUTES);
  }

  public static TimeLength seconds(long seconds) {
    return new TimeLength(seconds, TimeUnit.SECONDS);
  }

  public static TimeLength milliseconds(long milliseconds) {
    return new TimeLength(milliseconds, TimeUnit.MILLISECONDS);
  }

  private final long length;
  private final TimeUnit unit;

  private TimeLength(long length, TimeUnit unit) {
    this.length = length;
    this.unit = unit;
  }

  public long length() {
    return length;
  }

  public TimeUnit unit() {
    return unit;
  }

  public long toMilliseconds() {
    return unit.toMillis(length);
  }

  public long toSeconds() {
    return unit.toSeconds(length);
  }

  @Override
  public boolean equals(Object other) {
    if (this == other) return true;
    if (!(other instanceof TimeLength)) return false;

    TimeLength that = (TimeLength) other;

    return toMilliseconds() == that.toMilliseconds();
  }

  @Override
  public int hashCode() {
    long mills = toMilliseconds();
    return (int) (mills ^ (mills >>> 32));
  }
}