/** This file is part of Save For Offline, an Android app which saves / downloads complete webpages for offine reading. **/ /** * @author Ionut G. Stan <ionut.g.stan@gmail.com> * Modified by JonasCz (Refactored a bit) */ package jonas.tool.saveForOffline; import java.util.Calendar; import java.text.*; import java.util.*; public class FuzzyDateFormatter { private final static int SECONDS = 1; private final static int MINUTES = 60 * SECONDS; private final static int HOURS = 60 * MINUTES; private final static int DAYS = 24 * HOURS; private final static int WEEKS = 7 * DAYS; private final static int MONTHS = 4 * WEEKS; private final static int YEARS = 12 * MONTHS; private final Calendar currentTime; public FuzzyDateFormatter(Calendar currentTime) { this.currentTime = currentTime; } public String getFuzzy (String dateTime) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); Calendar cal = Calendar.getInstance(); cal.setTime(sdf.parse(dateTime)); return timeAgo(cal); } public String timeAgo(Calendar before) { int beforeSeconds = (int) (before.getTimeInMillis() / 1000); int nowSeconds = (int) (currentTime.getTimeInMillis() / 1000); int timeDifference = nowSeconds - beforeSeconds; int unit; if (timeDifference < MINUTES) { unit = SECONDS; } else if (timeDifference < HOURS) { unit = MINUTES; } else if (timeDifference < DAYS) { unit = HOURS; } else if (timeDifference < WEEKS) { unit = DAYS; } else if (timeDifference < MONTHS) { unit = WEEKS; } else if (timeDifference < YEARS) { unit = MONTHS; } else { unit = YEARS; } return callUnit(unit, timeDifference); } private String callUnit(int unit, int difference) { difference = difference / unit; if (difference == 1) { return callSingleUnit(unit); } else { return callMultiUnit(unit, difference); } } private String callMultiUnit(int unit, int difference) { switch (unit) { case SECONDS: return FuzzyMessages.someSecondsAgo(difference); case MINUTES: return FuzzyMessages.someMinutesAgo(difference); case HOURS: return FuzzyMessages.someHoursAgo(difference); case DAYS: return FuzzyMessages.someDaysAgo(difference); case WEEKS: return FuzzyMessages.someWeeksAgo(difference); case MONTHS: return FuzzyMessages.someMonthsAgo(difference); case YEARS: return FuzzyMessages.someYearsAgo(difference); default: throw new RuntimeException("Unknown multi unit"); } } private String callSingleUnit(int unit) { switch (unit) { case SECONDS: return FuzzyMessages.oneSecondAgo(); case MINUTES: return FuzzyMessages.oneMinuteAgo(); case HOURS: return FuzzyMessages.oneHourAgo(); case DAYS: return FuzzyMessages.oneDayAgo(); case WEEKS: return FuzzyMessages.oneWeekAgo(); case MONTHS: return FuzzyMessages.oneMonthAgo(); case YEARS: return FuzzyMessages.oneYearAgo(); default: throw new RuntimeException("Unknown single unit"); } } private static class FuzzyMessages { public static String oneSecondAgo() { return "just now"; } public static String someSecondsAgo(int numberOfSeconds) { return "just now"; } public static String oneMinuteAgo() { return "just now"; } public static String someMinutesAgo(int numberOfMinutes) { if (numberOfMinutes <= 15) { return "just now"; } else { return "a few minutes ago"; } } public static String oneHourAgo() { return "one hour ago"; } public static String someHoursAgo(int numberOfHours) { return "today"; } public static String oneDayAgo() { return "yesterday"; } public static String someDaysAgo(int numberOfDays) { return "this week"; } public static String oneWeekAgo() { return " last week"; } public static String someWeeksAgo(int numberOfWeeks) { return numberOfWeeks + " weeks ago"; } public static String oneMonthAgo() { return " one month ago"; } public static String someMonthsAgo(int numberOfMonths) { return numberOfMonths + " months ago"; } public static String oneYearAgo() { return "last year"; } public static String someYearsAgo(int numberOfYears) { return numberOfYears + " years ago"; } } }