James Moger
2011-11-11 d65f712ea3d8941f4b9145c0630c30c20af80d13
src/com/gitblit/utils/TimeUtils.java
@@ -15,35 +15,64 @@
 */
package com.gitblit.utils;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
 * Utility class of time functions.
 *
 * @author James Moger
 *
 */
public class TimeUtils {
   private final static long min = 1000 * 60l;
   public static final long MIN = 1000 * 60L;
   private final static long halfhour = min * 30l;
   public static final long HALFHOUR = MIN * 30L;
   private final static long onehour = halfhour * 2;
   public static final long ONEHOUR = HALFHOUR * 2;
   private final static long oneday = onehour * 24l;
   public static final long ONEDAY = ONEHOUR * 24L;
   @SuppressWarnings("deprecation")
   public static final long ONEYEAR = ONEDAY * 365L;
   /**
    * Returns true if date is today.
    *
    * @param date
    * @return true if date is today
    */
   public static boolean isToday(Date date) {
      Date now = new Date();
      return now.getDate() == date.getDate() && now.getMonth() == date.getMonth() && now.getYear() == date.getYear();
      return (System.currentTimeMillis() - date.getTime()) < ONEDAY;
   }
   @SuppressWarnings("deprecation")
   /**
    * Returns true if date is yesterday.
    *
    * @param date
    * @return true if date is yesterday
    */
   public static boolean isYesterday(Date date) {
      Date now = new Date();
      return now.getDate() == (date.getDate() + 1) && now.getMonth() == date.getMonth() && now.getYear() == date.getYear();
      Calendar cal = Calendar.getInstance();
      cal.setTime(new Date());
      cal.add(Calendar.DATE, -1);
      SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
      return df.format(cal.getTime()).equals(df.format(date));
   }
   /**
    * Returns the string representation of the duration as days, months and/or
    * years.
    *
    * @param days
    * @return duration as string in days, months, and/or years
    */
   public static String duration(int days) {
      if (days <= 60) {
         return days + (days > 1 ? " days" : " day");
      } else if (days <= 365) {
      } else if (days < 365) {
         int rem = days % 30;
         return (days / 30) + " months, " + rem + (rem > 1 ? " days" : " day");
         return ((days / 30) + (rem >= 15 ? 1 : 0)) + " months";
      } else {
         int years = days / 365;
         int rem = days % 365;
@@ -52,82 +81,129 @@
            if (rem == 0) {
               return yearsString;
            } else {
               return yearsString + ", " + rem + (rem > 1 ? " days" : " day");
               return yearsString + (rem >= 15 ? ", 1 month" : "");
            }
         } else {
            int months = rem / 30;
            int remDays = (rem % 30);
            String monthsString;
            if (months == 0) {
               monthsString = yearsString;
            } else {
               monthsString = yearsString + ", " + months + (months > 1 ? " months" : " month");
            int remDays = rem % 30;
            if (remDays >= 15) {
               months++;
            }
            if (remDays == 0) {
               return  monthsString;
            } else {
               return monthsString + ", " + remDays + (remDays > 1 ? " days":" day");
            }
            String monthsString = yearsString + ", " + months
                  + (months > 1 ? " months" : " month");
            return monthsString;
         }
      }
   }
   /**
    * Returns the number of minutes ago between the start time and the end
    * time.
    *
    * @param date
    * @param endTime
    * @param roundup
    * @return difference in minutes
    */
   public static int minutesAgo(Date date, long endTime, boolean roundup) {
      long diff = endTime - date.getTime();
      int mins = (int) (diff / min);
      if (roundup && (diff % min) >= 30)
      int mins = (int) (diff / MIN);
      if (roundup && (diff % MIN) >= 30) {
         mins++;
      }
      return mins;
   }
   /**
    * Return the difference in minutes between now and the date.
    *
    * @param date
    * @param roundup
    * @return minutes ago
    */
   public static int minutesAgo(Date date, boolean roundup) {
      return minutesAgo(date, System.currentTimeMillis(), roundup);
   }
   /**
    * Return the difference in hours between now and the date.
    *
    * @param date
    * @param roundup
    * @return hours ago
    */
   public static int hoursAgo(Date date, boolean roundup) {
      long diff = System.currentTimeMillis() - date.getTime();
      int hours = (int) (diff / onehour);
      if (roundup && (diff % onehour) >= halfhour)
      int hours = (int) (diff / ONEHOUR);
      if (roundup && (diff % ONEHOUR) >= HALFHOUR) {
         hours++;
      }
      return hours;
   }
   /**
    * Return the difference in days between now and the date.
    *
    * @param date
    * @param roundup
    * @return days ago
    */
   public static int daysAgo(Date date, boolean roundup) {
      long diff = System.currentTimeMillis() - date.getTime();
      int days = (int) (diff / oneday);
      if (roundup && (diff % oneday) > 0)
      int days = (int) (diff / ONEDAY);
      if (roundup && (diff % ONEDAY) > 0) {
         days++;
      }
      return days;
   }
   /**
    * Returns the string representation of the duration between now and the
    * date.
    *
    * @param date
    * @return duration as a string
    */
   public static String timeAgo(Date date) {
      return timeAgo(date, false);
   }
   /**
    * Returns the CSS class for the date based on its age from Now.
    *
    * @param date
    * @return the css class
    */
   public static String timeAgoCss(Date date) {
      return timeAgo(date, true);
   }
   /**
    * Returns the string representation of the duration OR the css class for
    * the duration.
    *
    * @param date
    * @param css
    * @return the string representation of the duration OR the css class
    */
   private static String timeAgo(Date date, boolean css) {
      String ago = null;
      if (isToday(date) || isYesterday(date)) {
         int mins = minutesAgo(date, true);
         if (mins > 120) {
         if (mins >= 120) {
            if (css) {
               return "age1";
            }
            int hours = hoursAgo(date, true);
            if (hours > 23) {
               ago = "yesterday";
               return "yesterday";
            } else {
               ago = hours + " hour" + (hours > 1 ? "s" : "") + " ago";
               return hours + " hours ago";
            }
         } else {
            if (css) {
               return "age0";
            }
            ago = mins + " min" + (mins > 1 ? "s" : "") + " ago";
         }
         if (css) {
            return "age0";
         }
         return mins + " min" + (mins > 1 ? "s" : "") + " ago";
      } else {
         if (css) {
            return "age2";
@@ -135,34 +211,68 @@
         int days = daysAgo(date, true);
         if (days < 365) {
            if (days <= 30) {
               ago = days + " day" + (days > 1 ? "s" : "") + " ago";
               return days + " days ago";
            } else if (days <= 90) {
               int weeks = days / 7;
               if (weeks == 12)
                  ago = "3 months ago";
               else
                  ago = weeks + " weeks ago";
            } else if (days > 90) {
               int months = days / 30;
               int weeks = (days % 30) / 7;
               if (weeks >= 2)
                  months++;
               ago = months + " month" + (months > 1 ? "s" : "") + " ago";
            } else
               ago = days + " day" + (days > 1 ? "s" : "") + " ago";
               if (weeks == 12) {
                  return "3 months ago";
               } else {
                  return weeks + " weeks ago";
               }
            }
            int months = days / 30;
            int weeks = (days % 30) / 7;
            if (weeks >= 2) {
               months++;
            }
            return months + " months ago";
         } else if (days == 365) {
            ago = "1 year ago";
            return "1 year ago";
         } else {
            int yr = days / 365;
            days = days % 365;
            int months = (yr * 12) + (days / 30);
            if (months > 23) {
               ago = yr + " years ago";
               return yr + " years ago";
            } else {
               ago = months + " months ago";
               return months + " months ago";
            }
         }
      }
      return ago;
   }
   /**
    * Convert a frequency string into minutes.
    *
    * @param frequency
    * @return minutes
    */
   public static int convertFrequencyToMinutes(String frequency) {
      // parse the frequency
      frequency = frequency.toLowerCase();
      int mins = 60;
      if (!StringUtils.isEmpty(frequency)) {
         try {
            String str = frequency.trim();
            if (frequency.indexOf(' ') > -1) {
               str = str.substring(0, str.indexOf(' ')).trim();
            }
            mins = (int) Float.parseFloat(str);
         } catch (NumberFormatException e) {
         }
         if (mins < 5) {
            mins = 5;
         }
      }
      if (frequency.indexOf("day") > -1) {
         // convert to minutes
         mins *= 1440;
      } else if (frequency.indexOf("hour") > -1) {
         // convert to minutes
         mins *= 60;
      } else if (frequency.indexOf("min") > -1) {
         // default mins
      }
      return mins;
   }
}