package com.github.tibolte.agendacalendarview.utils; import com.github.tibolte.agendacalendarview.CalendarManager; import com.github.tibolte.agendacalendarview.R; import com.github.tibolte.agendacalendarview.models.IWeekItem; import android.content.Context; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.concurrent.TimeUnit; /** * Class containing helper functions for dates */ public class DateHelper { // region Public methods /** * Check if two Calendar instances have the same time (by month, year and day of month) * * @param cal The first Calendar instance. * @param selectedDate The second Calendar instance. * @return True if both instances have the same time. */ public static boolean sameDate(Calendar cal, Calendar selectedDate) { return cal.get(Calendar.MONTH) == selectedDate.get(Calendar.MONTH) && cal.get(Calendar.YEAR) == selectedDate.get(Calendar.YEAR) && cal.get(Calendar.DAY_OF_MONTH) == selectedDate.get(Calendar.DAY_OF_MONTH); } /** * Check if a Date instance and a Calendar instance have the same time (by month, year and day * of month) * * @param cal The Calendar instance. * @param selectedDate The Date instance. * @return True if both have the same time. */ public static boolean sameDate(Calendar cal, Date selectedDate) { Calendar selectedCal = Calendar.getInstance(); selectedCal.setTime(selectedDate); return cal.get(Calendar.MONTH) == selectedCal.get(Calendar.MONTH) && cal.get(Calendar.YEAR) == selectedCal.get(Calendar.YEAR) && cal.get(Calendar.DAY_OF_MONTH) == selectedCal.get(Calendar.DAY_OF_MONTH); } /** * Check if a Date instance is between two Calendar instances' dates (inclusively) in time. * * @param selectedDate The date to verify. * @param startCal The start time. * @param endCal The end time. * @return True if the verified date is between the two specified dates. */ public static boolean isBetweenInclusive(Date selectedDate, Calendar startCal, Calendar endCal) { Calendar selectedCal = Calendar.getInstance(); selectedCal.setTime(selectedDate); // Check if we deal with the same day regarding startCal and endCal return sameDate(selectedCal, startCal) || selectedCal.after(startCal) && selectedCal.before(endCal); } /** * Check if Calendar instance's date is in the same week, as the WeekItem instance. * * @param cal The Calendar instance to verify. * @param week The WeekItem instance to compare to. * @return True if both instances are in the same week. */ public static boolean sameWeek(Calendar cal, IWeekItem week) { return (cal.get(Calendar.WEEK_OF_YEAR) == week.getWeekInYear() && cal.get(Calendar.YEAR) == week.getYear()); } /** * Convert a millisecond duration to a string format * * @param millis A duration to convert to a string form * @return A string of the form "Xd" or either "XhXm". */ public static String getDuration(Context context, long millis) { if (millis < 0) { throw new IllegalArgumentException("Duration must be greater than zero!"); } long days = TimeUnit.MILLISECONDS.toDays(millis); millis -= TimeUnit.DAYS.toMillis(days); long hours = TimeUnit.MILLISECONDS.toHours(millis); millis -= TimeUnit.HOURS.toMillis(hours); long minutes = TimeUnit.MILLISECONDS.toMinutes(millis); StringBuilder sb = new StringBuilder(64); if (days > 0) { sb.append(days); sb.append(context.getResources().getString(R.string.agenda_event_day_duration)); return (sb.toString()); } else { if (hours > 0) { sb.append(hours); sb.append("h"); } if (minutes > 0) { sb.append(minutes); sb.append("m"); } } return (sb.toString()); } /** * Used for displaying the date in any section of the agenda view. * * @param calendar The date of the section. * @param locale The locale used by the Sunrise calendar. * @return The formatted date without the year included. */ public static String getYearLessLocalizedDate(Calendar calendar, Locale locale) { SimpleDateFormat sdf = (SimpleDateFormat) SimpleDateFormat.getDateInstance(DateFormat.FULL, CalendarManager.getInstance().getLocale()); String pattern = sdf.toPattern(); String yearLessPattern = pattern.replaceAll("\\W?[Yy]+\\W?", ""); SimpleDateFormat yearLessSDF = new SimpleDateFormat(yearLessPattern, locale); String yearLessDate = yearLessSDF.format(calendar.getTime()).toUpperCase(); if (yearLessDate.endsWith(",")) { yearLessDate = yearLessDate.substring(0, yearLessDate.length() - 1); } return yearLessDate; } // endregion }