James Moger
2012-10-13 c658df9e87d65b08d5482cf04489cb0532ff83dd
src/com/gitblit/utils/TimeUtils.java
@@ -15,10 +15,11 @@
 */
package com.gitblit.utils;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import com.gitblit.models.FederationModel;
import java.util.ResourceBundle;
/**
 * Utility class of time functions.
@@ -36,6 +37,16 @@
   public static final long ONEDAY = ONEHOUR * 24L;
   public static final long ONEYEAR = ONEDAY * 365L;
   private final ResourceBundle translation;
   public TimeUtils() {
      this(null);
   }
   public TimeUtils(ResourceBundle translation) {
      this.translation = translation;
   }
   /**
    * Returns true if date is today.
@@ -55,9 +66,10 @@
    */
   public static boolean isYesterday(Date date) {
      Calendar cal = Calendar.getInstance();
      cal.setTime(date);
      cal.add(Calendar.DATE, 1);
      return (System.currentTimeMillis() - cal.getTimeInMillis()) < ONEDAY;
      cal.setTime(new Date());
      cal.add(Calendar.DATE, -1);
      SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
      return df.format(cal.getTime()).equals(df.format(date));
   }
   /**
@@ -67,21 +79,21 @@
    * @param days
    * @return duration as string in days, months, and/or years
    */
   public static String duration(int days) {
   public String duration(int days) {
      if (days <= 60) {
         return days + (days > 1 ? " days" : " day");
         return (days > 1 ? translate(days, "gb.duration.days", "{0} days") : translate("gb.duration.oneDay", "1 day"));
      } else if (days < 365) {
         int rem = days % 30;
         return ((days / 30) + (rem >= 15 ? 1 : 0)) + " months";
         return translate(((days / 30) + (rem >= 15 ? 1 : 0)), "gb.duration.months", "{0} months");
      } else {
         int years = days / 365;
         int rem = days % 365;
         String yearsString = years + (years > 1 ? " years" : " year");
         String yearsString = (years > 1 ? translate(years, "gb.duration.years", "{0} years") : translate("gb.duration.oneYear", "1 year"));
         if (rem < 30) {
            if (rem == 0) {
               return yearsString;
            } else {
               return yearsString + (rem >= 15 ? ", 1 month" : "");
               return yearsString + (rem >= 15 ? (", " + translate("gb.duration.oneMonth", "1 month")): "");
            }
         } else {
            int months = rem / 30;
@@ -89,8 +101,8 @@
            if (remDays >= 15) {
               months++;
            }
            String monthsString = yearsString + ", " + months
                  + (months > 1 ? " months" : " month");
            String monthsString = yearsString + ", "
                  + (months > 1 ? translate(months, "gb.duration.months", "{0} months") : translate("gb.duration.oneMonth", "1 month"));
            return monthsString;
         }
      }
@@ -145,16 +157,22 @@
    * 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();
   public static int daysAgo(Date date) {
      long today = ONEDAY * (System.currentTimeMillis()/ONEDAY);
      long day = ONEDAY * (date.getTime()/ONEDAY);
      long diff = today - day;
      int days = (int) (diff / ONEDAY);
      if (roundup && (diff % ONEDAY) > 0) {
         days++;
      }
      return days;
   }
   public String today() {
      return translate("gb.time.today", "today");
   }
   public String yesterday() {
      return translate("gb.time.yesterday", "yesterday");
   }
   /**
@@ -164,7 +182,7 @@
    * @param date
    * @return duration as a string
    */
   public static String timeAgo(Date date) {
   public String timeAgo(Date date) {
      return timeAgo(date, false);
   }
@@ -174,7 +192,7 @@
    * @param date
    * @return the css class
    */
   public static String timeAgoCss(Date date) {
   public String timeAgoCss(Date date) {
      return timeAgo(date, true);
   }
@@ -186,7 +204,7 @@
    * @param css
    * @return the string representation of the duration OR the css class
    */
   private static String timeAgo(Date date, boolean css) {
   private String timeAgo(Date date, boolean css) {
      if (isToday(date) || isYesterday(date)) {
         int mins = minutesAgo(date, true);
         if (mins >= 120) {
@@ -195,29 +213,38 @@
            }
            int hours = hoursAgo(date, true);
            if (hours > 23) {
               return "yesterday";
               return yesterday();
            } else {
               return hours + " hours ago";
               return translate(hours, "gb.time.hoursAgo", "{0} hours ago");
            }
         }
         if (css) {
            return "age0";
         }
         return mins + " min" + (mins > 1 ? "s" : "") + " ago";
      } else {
         if (css) {
            return "age2";
         if (mins > 2) {
            return translate(mins, "gb.time.minsAgo", "{0} mins ago");
         }
         int days = daysAgo(date, true);
         return translate("gb.time.justNow", "just now");
      } else {
         int days = daysAgo(date);
         if (css) {
            if (days <= 7) {
               return "age2";
            } if (days <= 30) {
               return "age3";
            } else {
               return "age4";
            }
         }
         if (days < 365) {
            if (days <= 30) {
               return days + " days ago";
               return translate(days, "gb.time.daysAgo", "{0} days ago");
            } else if (days <= 90) {
               int weeks = days / 7;
               if (weeks == 12) {
                  return "3 months ago";
                  return translate(3, "gb.time.monthsAgo", "{0} months ago");
               } else {
                  return weeks + " weeks ago";
                  return translate(weeks, "gb.time.weeksAgo", "{0} weeks ago");
               }
            }
            int months = days / 30;
@@ -225,20 +252,42 @@
            if (weeks >= 2) {
               months++;
            }
            return months + " months ago";
            return translate(months, "gb.time.monthsAgo", "{0} months ago");
         } else if (days == 365) {
            return "1 year ago";
            return translate("gb.time.oneYearAgo", "1 year ago");
         } else {
            int yr = days / 365;
            days = days % 365;
            int months = (yr * 12) + (days / 30);
            if (months > 23) {
               return yr + " years ago";
               return translate(yr, "gb.time.yearsAgo", "{0} years ago");
            } else {
               return months + " months ago";
               return translate(months, "gb.time.monthsAgo", "{0} months ago");
            }
         }
      }
   }
   private String translate(String key, String defaultValue) {
      String value = defaultValue;
      if (translation != null && translation.containsKey(key)) {
         String aValue = translation.getString(key);
         if (!StringUtils.isEmpty(aValue)) {
            value = aValue;
         }
      }
      return value;
   }
   private String translate(int val, String key, String defaultPattern) {
      String pattern = defaultPattern;
      if (translation != null && translation.containsKey(key)) {
         String aValue = translation.getString(key);
         if (!StringUtils.isEmpty(aValue)) {
            pattern = aValue;
         }
      }
      return MessageFormat.format(pattern, val);
   }
   /**
@@ -253,11 +302,9 @@
      int mins = 60;
      if (!StringUtils.isEmpty(frequency)) {
         try {
            String str;
            String str = frequency.trim();
            if (frequency.indexOf(' ') > -1) {
               str = frequency.substring(0, frequency.indexOf(' ')).trim();
            } else {
               str = frequency.trim();
               str = str.substring(0, str.indexOf(' ')).trim();
            }
            mins = (int) Float.parseFloat(str);
         } catch (NumberFormatException e) {
@@ -268,12 +315,10 @@
      }
      if (frequency.indexOf("day") > -1) {
         // convert to minutes
         mins *= 24 * 60;
         mins *= 1440;
      } else if (frequency.indexOf("hour") > -1) {
         // convert to minutes
         mins *= 60;
      } else if (frequency.indexOf("min") > -1) {
         // default mins
      }
      return mins;
   }