package net.dev123.commons.util;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class TimeSpanUtil {
private static final int ONE_HOUR_IN_SECONDS = 60 * 60;
private static final int TWO_HOUR_IN_SECONDS = ONE_HOUR_IN_SECONDS * 2;
private static final int ONE_DAY_IN_SECONDS = 24 * ONE_HOUR_IN_SECONDS;
private static long TODAY_IN_SECONDS;
private static long THIS_YEAR_IN_SECONDS;
private static SimpleDateFormat timeDateFormat = new SimpleDateFormat("HH:mm");
private static SimpleDateFormat monthDateFormat = new SimpleDateFormat("MM-dd HH:mm");
private static SimpleDateFormat yearDateFormat = new SimpleDateFormat("yy-MM-dd HH:mm");
public static String timeFormatWithinSeconds = " within %1$d seconds";
public static String timeFormatHalfMinuteAgo = " half minute ago";
public static String timeFormatWithinOneMinute = " within 1 minute";
public static String timeFormatOneMinuteAgo = " 1 minute ago";
public static String timeFormatMinutesAgo = " %1$d minutes ago";
public static String timeFormatToday = " Today %1$s";
public static String timeFormatOneHourAgo = " 1 hour ago";
public static String timeFormatHoursAgo = " %1$d hours ago";
public static String timeFormatOneDayAgo = " 1 day ago";
public static String timeFormatDaysAgo = " %1$d days ago";
public static String timeFormatWeeksAgo = " %1$d weeks ago";
static {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
TODAY_IN_SECONDS = (System.currentTimeMillis() - calendar.getTimeInMillis()) / 1000;
calendar.set(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, 0);
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
THIS_YEAR_IN_SECONDS = (System.currentTimeMillis() - calendar.getTimeInMillis()) / 1000;
}
private TimeSpanUtil() {
throw new AssertionError("not intended to be instantiated.");
}
public static String toTimeSpanString(Date date) {
if (date == null) {
return "";
}
long milliseconds = date.getTime();
int deltaInSeconds = (int) ((System.currentTimeMillis() - milliseconds) / 1000);
if (deltaInSeconds <= ONE_HOUR_IN_SECONDS) {
return toTimeSpanString(deltaInSeconds);
} else if (deltaInSeconds <= TODAY_IN_SECONDS) {
return String.format(timeFormatToday, timeDateFormat.format(date));
} else if (deltaInSeconds <= THIS_YEAR_IN_SECONDS) {
return monthDateFormat.format(date);
}
return yearDateFormat.format(date);
}
public static String toTimeSpanString(int deltaInSeconds) {
if (deltaInSeconds < 5) {
return String.format(timeFormatWithinSeconds, 5);
} else if (deltaInSeconds < 10) {
return String.format(timeFormatWithinSeconds, 10);
} else if (deltaInSeconds < 20) {
return String.format(timeFormatWithinSeconds, 20);
} else if (deltaInSeconds < 40) {
return timeFormatHalfMinuteAgo;
} else if (deltaInSeconds < 60) {
return timeFormatWithinOneMinute;
}
if (deltaInSeconds < ONE_HOUR_IN_SECONDS) {
int minutes = deltaInSeconds / 60;
if (minutes == 1) {
return timeFormatOneMinuteAgo;
}
return String.format(timeFormatMinutesAgo, minutes);
}
if (deltaInSeconds < TWO_HOUR_IN_SECONDS) {
return timeFormatOneHourAgo;
}
if (deltaInSeconds < ONE_DAY_IN_SECONDS) {
int hours = ((deltaInSeconds + 15 * 60) / ONE_HOUR_IN_SECONDS);
if (hours < 24) {
return String.format(timeFormatHoursAgo, hours);
}
}
if (deltaInSeconds < 2 * ONE_DAY_IN_SECONDS) {
return timeFormatOneDayAgo;
}
if (deltaInSeconds < 14 * ONE_DAY_IN_SECONDS) {
int days = deltaInSeconds / ONE_DAY_IN_SECONDS;
return String.format(timeFormatDaysAgo, days);
}
int weeks = deltaInSeconds / (ONE_DAY_IN_SECONDS * 7);
return String.format(timeFormatWeeksAgo, weeks);
}
}