Skip to content

Instantly share code, notes, and snippets.

@adamcmwilson
Created June 21, 2014 02:55
Show Gist options
  • Select an option

  • Save adamcmwilson/35fa22049ab3dea0e0ca to your computer and use it in GitHub Desktop.

Select an option

Save adamcmwilson/35fa22049ab3dea0e0ca to your computer and use it in GitHub Desktop.

Revisions

  1. adamcmwilson created this gist Jun 21, 2014.
    73 changes: 73 additions & 0 deletions DateTimeIntervalPhraser
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,73 @@
    public static class DateTimeIntervalPhraser {

    public static class Values {

    public static final Long SECOND = 1000l;
    public static final Long MINUTE = 60 * SECOND;
    public static final Long HOUR = 60 * MINUTE;
    public static final Long DAY = 24 * HOUR;
    public static final Long WEEK = 7 * DAY;
    public static final Long YEAR = 365 * DAY;
    public static final Long MONTH = YEAR / 12;

    private static final Long[] INTERVAL = new Long[]{
    YEAR, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND
    };

    private static final String[] LABEL = new String[]{
    "year", "month", "week", "day", "hour", "minute", "second"
    };

    }

    private static final String PREFIX_IN = "in ";
    private static final String PREFIX_WAS = "was ";
    private static final String SUFFIX_AGO = " ago";

    public static String from(final Calendar event, final boolean applyPrefix, final Long maxInterValue) throws DateTimeIntervalPhraserException {

    if (event == null)
    throw new DateTimeIntervalPhraserException("Event date cannot be null....");

    if (!Arrays.asList(Values.INTERVAL).contains(maxInterValue))
    throw new DateTimeIntervalPhraserException("MaxIntervalValue must be in DateTimeIntervalPhraser.Values.INTERVAL");

    Calendar now = Calendar.getInstance(TimeZone.getTimeZone("utc"));

    if (event.before(now)) return formatPastDate(event, now, applyPrefix, maxInterValue);
    else return formatFutureDate(event, now, applyPrefix, maxInterValue);
    }

    private static String formatPastDate(Calendar event, Calendar now, boolean applyPrefix, final long max) {
    return getUnitAndValue(now.getTimeInMillis() - event.getTimeInMillis(),
    applyPrefix ? PREFIX_WAS : "",
    applyPrefix ? SUFFIX_AGO : "", max);
    }

    private static String formatFutureDate(Calendar event, Calendar now, boolean applyPrefix, final long max) {
    return getUnitAndValue(event.getTimeInMillis() - now.getTimeInMillis(), applyPrefix ? PREFIX_IN : "", "", max);
    }

    private static String getUnitAndValue(final long diff, final String prefix, final String suffix, final long max) {
    for (int i = 0; i < Values.INTERVAL.length; ++i) {
    final long interval = Values.INTERVAL[i];
    final long val = diff / interval;

    if (interval == max || val >= 1)
    return getFormatted(Values.LABEL[i], val, prefix, suffix);
    }

    return "";
    }

    private static String getFormatted(final String unit, final long count, final String prefix, final String suffix) {
    return prefix + String.valueOf(count) + " " + unit + (count != 1 ? "s" : "") + suffix;
    }

    public static class DateTimeIntervalPhraserException extends RuntimeException {
    public DateTimeIntervalPhraserException(String detailMessage) {
    super(detailMessage);
    }
    }
    }