package com.boardgamegeek.util; import android.content.Context; import android.content.res.Resources; import android.text.TextUtils; import android.text.format.DateUtils; import com.boardgamegeek.R; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; import timber.log.Timber; public class DateTimeUtils { public static final long UNPARSED_DATE = -2; public static final long UNKNOWN_DATE = -1; private static final DateFormat FORMAT_API = new SimpleDateFormat("yyyy-MM-dd", Locale.US); private static final String FORMAT_MINUTES = "%d:%02d"; private DateTimeUtils() { } /** * Format minutes as "H hrs M mins" or "M mins" if less than an hour. */ public static String describeMinutes(Context context, int minutes) { Resources r = context.getResources(); if (minutes < 60) { return String.valueOf(minutes) + " " + r.getString(R.string.minutes_abbr); } else { int hours = minutes / 60; int mins = minutes % 60; if (mins == 0) { return String.valueOf(hours) + " " + r.getString(R.string.hours_abbr); } return String.valueOf(hours) + " " + r.getString(R.string.hours_abbr) + " " + String.valueOf(mins) + " " + r.getString(R.string.minutes_abbr); } } /** * Format minutes as "H:MM" */ public static String formatMinutes(int time) { if (time > 0) { int hours = time / 60; int minutes = time % 60; return String.format(FORMAT_MINUTES, hours, minutes); } return "0:00"; } /** * Determines how many days ago time was (rounded down). */ public static int howManyDaysOld(long time) { return (int) ((System.currentTimeMillis() - time) / DateUtils.DAY_IN_MILLIS); } /** * Determines how many days ago time was (rounded down). */ public static int howManyHoursOld(long time) { return (int) ((System.currentTimeMillis() - time) / DateUtils.HOUR_IN_MILLIS); } /** * Determines how many minutes ago time was (rounded up/down). */ public static int howManyMinutesOld(long time) { return (int) ((System.currentTimeMillis() - time + 30000) / DateUtils.MINUTE_IN_MILLIS); } /** * Returns the long representation of the time "hours" ago. */ public static long hoursAgo(int hours) { long timeInMillis = hours * DateUtils.HOUR_IN_MILLIS; return System.currentTimeMillis() - timeInMillis; } /** * Formats a date for use in the API (<code>yyyy-mm-dd</code>) */ public static String formatDateForApi(int year, int month, int day) { return String.format("%04d", year) + "-" + String.format("%02d", month + 1) + "-" + String.format("%02d", day); } public static String formatDateFromApi(Context context, String date) { long millis = getMillisFromApiDate(date, Long.MAX_VALUE); if (millis == Long.MAX_VALUE) { return ""; } return DateUtils.formatDateTime(context, millis, DateUtils.FORMAT_SHOW_DATE); } public static long getMillisFromApiDate(String date, long defaultMillis) { if (TextUtils.isEmpty(date)) { return defaultMillis; } String[] parts = date.split("-"); if (parts.length != 3) { return defaultMillis; } Calendar calendar = Calendar.getInstance(); try { calendar.set(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]) - 1, Integer.parseInt(parts[2])); } catch (Exception e) { Timber.w(e, "Couldn't get a date from the API: %s", date); } return calendar.getTimeInMillis(); } /** * Formats a date for use in the API (<code>yyyy-mm-dd</code>) */ public static String formatDateForApi(long date) { Calendar c = Calendar.getInstance(); c.setTimeInMillis(date); return FORMAT_API.format(c.getTime()); } /** * Attempt to parse the string date according to the given format. Will use the time parameter if it was already * parsed. */ public static long tryParseDate(long time, String date, DateFormat format) { if (TextUtils.isEmpty(date)) { time = UNKNOWN_DATE; } else { if (time == UNPARSED_DATE) { try { time = format.parse(date).getTime(); } catch (ParseException e) { time = UNKNOWN_DATE; } } } return time; } }