package com.quickblox.q_municate.utils; import android.content.res.Resources; import com.quickblox.q_municate.App; import com.quickblox.q_municate.R; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.TimeZone; import java.util.concurrent.TimeUnit; public class DateUtils { public static final long SECOND_IN_MILLIS = 1000; public static final long MINUTE_IN_MILLIS = SECOND_IN_MILLIS * 60; public static final long HOUR_IN_MILLIS = MINUTE_IN_MILLIS * 60; public static final long DAY_IN_MILLIS = HOUR_IN_MILLIS * 24; public static final long YEAR_IN_MILLIS = DAY_IN_MILLIS * 365; private static final SimpleDateFormat FULL_DATE_FORMAT; private static final SimpleDateFormat SHORT_DATE_FORMAT; private static final SimpleDateFormat SHORT_DATE_WITHOUT_DIVIDERS_FORMAT; private static final SimpleDateFormat SIMPLE_TIME_FORMAT; private static final SimpleDateFormat DAY_AND_MONTH_AND_YEAR_FULL_FORMAT; private static final SimpleDateFormat DAY_AND_MONTH_AND_YEAR_SHORT_FORMAT; private static final SimpleDateFormat DAY_AND_SHORT_MONTH_FORMAT; private static final SimpleDateFormat SHORT_MONTH_AND_DAY_FORMAT; static { FULL_DATE_FORMAT = new SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()); SHORT_DATE_FORMAT = new SimpleDateFormat("dd/MM/yy", Locale.getDefault()); SHORT_DATE_WITHOUT_DIVIDERS_FORMAT = new SimpleDateFormat("ddMMyyyy", Locale.getDefault()); SIMPLE_TIME_FORMAT = new SimpleDateFormat("HH:mm", Locale.getDefault()); DAY_AND_MONTH_AND_YEAR_FULL_FORMAT = new SimpleDateFormat("dd MMMM, yyyy", Locale.getDefault()); DAY_AND_MONTH_AND_YEAR_SHORT_FORMAT = new SimpleDateFormat("dd MMM yyyy", Locale.getDefault()); DAY_AND_SHORT_MONTH_FORMAT = new SimpleDateFormat("dd MMM", Locale.getDefault()); SHORT_MONTH_AND_DAY_FORMAT = new SimpleDateFormat("MMM dd", Locale.getDefault()); } public static long nowSeconds() { return nowMillis() / SECOND_IN_MILLIS; } public static long nowMillis() { return getCalendar().getTimeInMillis(); } public static Calendar getCalendar() { return Calendar.getInstance(TimeZone.getDefault()); } public static Calendar getCalendar(int year, int month, int day) { Calendar calendar = getCalendar(); calendar.set(year, month, day); return calendar; } public static Calendar getCalendar(long seconds) { Calendar calendar = getCalendar(); calendar.setTimeInMillis(seconds * SECOND_IN_MILLIS); return calendar; } public static long roundToDays(long seconds) { Calendar c = getCalendar(seconds); c.set(Calendar.MILLISECOND, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.HOUR_OF_DAY, 0); return c.getTimeInMillis() / SECOND_IN_MILLIS; } public static long getEndOfADay(long seconds) { Calendar calendar = getCalendar(seconds); calendar.set(Calendar.HOUR_OF_DAY, 23); calendar.set(Calendar.MINUTE, 59); calendar.set(Calendar.SECOND, 59); calendar.set(Calendar.MILLISECOND, 999); return calendar.getTimeInMillis() / SECOND_IN_MILLIS; } public static boolean isTimePassed(long seconds) { return DateUtils.getCalendar(seconds).before(DateUtils.getCalendar()); } /** * @return string in "Hours:Minutes" format, i.e. <b>11:23</b> */ public static String formatDateSimpleTime(long seconds) { return SIMPLE_TIME_FORMAT.format(new Date(seconds * SECOND_IN_MILLIS)); } /** * @return string in "Day-Month-Year" format, i.e. <b>17-08-1992</b> */ public static String formatDateFull(long seconds) { return FULL_DATE_FORMAT.format(new Date(seconds * SECOND_IN_MILLIS)); } public static String formatDateFullShortMonth(long seconds) { return DAY_AND_MONTH_AND_YEAR_SHORT_FORMAT.format(new Date(seconds * SECOND_IN_MILLIS)); } /** * @param dateString must be in Day-Month-Year format, i.e. <b>17-08-1992</b> * @return time in seconds */ public static long parseDateFull(String dateString) { try { return FULL_DATE_FORMAT.parse(dateString).getTime() / SECOND_IN_MILLIS; } catch (ParseException e) { e.printStackTrace(); return new Date().getTime() / SECOND_IN_MILLIS; } } /** * @param seconds time in seconds * @return time in format 2d 5h 5m + adds "ago" if seconds value is less than current time */ public static String toDaysHoursMinutesLeftShort(long seconds) { return toDaysHoursMinutesLeft(seconds, true); } /** * @param seconds time in seconds * @return time in format 2 days 5 hours 5 minutes + adds "ago" if seconds value is less than current time */ public static String toDaysHoursMinutesLeftFull(long seconds) { return toDaysHoursMinutesLeft(seconds, false); } private static String toDaysHoursMinutesLeft(long seconds, boolean shortFormat) { Calendar offerTime = getCalendar(seconds); Calendar now = getCalendar(); now.set(Calendar.MILLISECOND, 0); now.set(Calendar.SECOND, 0); long timeDiff = Math.abs(offerTime.getTimeInMillis() - now.getTimeInMillis()); int days = (int) TimeUnit.MILLISECONDS.toDays(timeDiff); int hours = (int) (TimeUnit.MILLISECONDS.toHours(timeDiff) - TimeUnit.DAYS.toHours(days)); int minutes = (int) (TimeUnit.MILLISECONDS.toMinutes(timeDiff) - TimeUnit.DAYS.toMinutes(days) - TimeUnit.HOURS.toMinutes(hours)); Resources res = App.getInstance().getResources(); StringBuilder stringBuilder = new StringBuilder(); if (days > 0) { String daysString = shortFormat ? App.getInstance().getString(R.string.days_short, days) : res.getQuantityString(R.plurals.days, days, days); stringBuilder.append(daysString).append(" "); } if (hours > 0) { String hoursString = shortFormat ? App.getInstance().getString(R.string.hours_short, hours) : res.getQuantityString(R.plurals.hours, hours, hours); stringBuilder.append(hoursString).append(" "); } if (minutes > 0 && days == 0) { String minutesString = shortFormat ? App.getInstance().getString(R.string.minutes_short, minutes) : res.getQuantityString(R.plurals.minutes, minutes, minutes); stringBuilder.append(minutesString); } else if (days == 0) { stringBuilder.append(shortFormat ? App.getInstance().getString(R.string.minutes_short, 0) : res.getQuantityString(R.plurals.minutes, 0)); } if (offerTime.before(now)) { stringBuilder.append(" ").append(App.getInstance().getString(R.string.date_ago)); } return stringBuilder.toString(); } public static String leftDays(long seconds) { StringBuilder sb = new StringBuilder(); Calendar now = getCalendar(); Calendar offerTime = getCalendar(seconds); long timeDiff = Math.abs(offerTime.getTimeInMillis() - now.getTimeInMillis()); int days = (int) TimeUnit.MILLISECONDS.toDays(timeDiff); sb.append(App.getInstance().getResources().getQuantityString(R.plurals.days, days, days)); return sb.toString(); } public static String leftMinutesHours(long seconds) { Calendar now = getCalendar(); Calendar offerTime = getCalendar(seconds); long timeDiff = Math.abs(offerTime.getTimeInMillis() - now.getTimeInMillis()); long days = TimeUnit.MILLISECONDS.toDays(timeDiff); long hours = TimeUnit.MILLISECONDS.toHours(timeDiff) - TimeUnit.DAYS.toHours(days); long minutes = TimeUnit.MILLISECONDS.toMinutes(timeDiff) - TimeUnit.DAYS.toMinutes(days) - TimeUnit.HOURS.toMinutes(hours); StringBuilder sb = new StringBuilder(); Resources res = App.getInstance().getResources(); if (hours > 0) { sb.append(res.getQuantityString(R.plurals.hours, (int) hours, hours)).append(" "); } if (minutes > 0) { sb.append(res.getQuantityString(R.plurals.minutes, (int) minutes, minutes)); } return sb.toString(); } public static int daysBetween(long seconds) { long date = roundToDays(seconds); long currentDate = roundToDays(nowSeconds()); long diff = date - currentDate; return (int) TimeUnit.DAYS.convert(diff, TimeUnit.SECONDS); } /** * @return today/yesterday string or "Day month, year" format, i.e. <b>17 April, 2015</b> */ public static String toTodayYesterdayFullMonthDate(long seconds) { return toTodayYesterdayDateByFormat(seconds, DAY_AND_MONTH_AND_YEAR_FULL_FORMAT); } /** * @return today/yesterday string or "Day month, year" format, i.e. <b>17 Apr 2015</b> */ public static String toTodayYesterdayShortMonthDate(long seconds) { return toTodayYesterdayDateByFormat(seconds, DAY_AND_MONTH_AND_YEAR_SHORT_FORMAT); } /** * @return today/yesterday string or "Day/Month/Year" format, i.e. <b>27/04/15</b> */ public static String toTodayYesterdayShortDate(long seconds) { return toTodayYesterdayDateByFormat(seconds, SHORT_DATE_FORMAT); } /** * @return today/yesterday string or "Day Month" format, i.e. <b>27 Dec</b> */ public static String toTodayYesterdayShortDateWithoutYear1(long seconds) { return toTodayYesterdayDateByFormat(seconds, DAY_AND_SHORT_MONTH_FORMAT); } /** * @return today/yesterday string or "Day Month" format, i.e. <b>Dec 27</b> */ public static String toTodayYesterdayShortDateWithoutYear2(long seconds) { return toTodayYesterdayDateByFormat(seconds, SHORT_MONTH_AND_DAY_FORMAT); } private static String toTodayYesterdayDateByFormat(long seconds, SimpleDateFormat simpleDateFormat) { long today = roundToDays(nowSeconds()); long inputDay = roundToDays(seconds); if (inputDay == today) { return App.getInstance().getString(R.string.today); } else if (inputDay == today - DAY_IN_MILLIS) { return App.getInstance().getString(R.string.yesterday); } else { return simpleDateFormat.format(new Date(seconds * SECOND_IN_MILLIS)); } } /** * @return <b>27042015</b> */ public static long toShortDateLong(long seconds) { Calendar calendar = getCalendar(seconds); return Long.parseLong(SHORT_DATE_WITHOUT_DIVIDERS_FORMAT.format(calendar.getTime())); } }