public DateTime truncate(Unit aPrecision) {
    ensureParsed();
    DateTime result = null;
    if (Unit.NANOSECONDS == aPrecision) {
      throw new IllegalArgumentException("It makes no sense to truncate to nanosecond precision, since that's the highest precision available.");
    }
    else if (Unit.SECOND == aPrecision) {
      result = new DateTime(fYear, fMonth, fDay, fHour, fMinute, fSecond, null);
    }
    else if (Unit.MINUTE == aPrecision) {
      result = new DateTime(fYear, fMonth, fDay, fHour, fMinute, null, null);
    }
    else if (Unit.HOUR == aPrecision) {
      result = new DateTime(fYear, fMonth, fDay, fHour, null, null, null);
    }
    else if (Unit.DAY == aPrecision) {
      result = new DateTime(fYear, fMonth, fDay, null, null, null, null);
    }
    else if (Unit.MONTH == aPrecision) {
      result = new DateTime(fYear, fMonth, null, null, null, null, null);
    }
    else if (Unit.YEAR == aPrecision) {
      result = new DateTime(fYear, null, null, null, null, null, null);
    }
    return result;
  }