Mega Code Archive

 
Categories / Java / Data Type
 

A utility class for converting a long into a human readable string

/*  * JBoss, Home of Professional Open Source.  * Copyright 2008, Red Hat Middleware LLC, and individual contributors  * as indicated by the @author tags. See the copyright.txt file in the  * distribution for a full listing of individual contributors.  *  * This is free software; you can redistribute it and/or modify it  * under the terms of the GNU Lesser General Public License as  * published by the Free Software Foundation; either version 2.1 of  * the License, or (at your option) any later version.  *  * This software is distributed in the hope that it will be useful,  * but WITHOUT ANY WARRANTY; without even the implied warranty of  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU  * Lesser General Public License for more details.  *  * You should have received a copy of the GNU Lesser General Public  * License along with this software; if not, write to the Free  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.  */ import java.io.Serializable; /**  * TimeFormat is a utility class for converting a long into a human readable  * string.  *   * <P>  *   * Example usage:  *   * <CODE> System.out.println("You have been online for:  * "+TimeFormat.valueOf(milliseconds)); </CODE>  *   * FIXME: expanded features need documentation. JGH  *   * @author <a href="mailto:jhaynie@vocalocity.net">Jeff Haynie</a>  * @date $Date: 2008-11-14 07:45:28 -0500 (Fri, 14 Nov 2008) $  * @version $Revision: 81022 $  */ public final class TimeFormat implements Serializable {   public static final boolean DEBUG = false;   public static final long ONE_MILLISECOND = (1);   public static final long ONE_SECOND = (ONE_MILLISECOND * 1000);   public static final long ONE_MINUTE = (ONE_SECOND * 60);   public static final long ONE_HOUR = (ONE_MINUTE * 60);   public static final long ONE_DAY = (ONE_HOUR * 24);   public static final int ROUND_TO_MILLISECOND = 5;   public static final int ROUND_TO_SECOND = 4;   public static final int ROUND_TO_MINUTE = 3;   public static final int ROUND_TO_HOUR = 2;   public static final int ROUND_TO_DAY = 1;   private long original = 0;   private long time = 0;   private long remainder = 0;   private long days = 0;   private long hours = 0;   private long minutes = 0;   private long seconds = 0;   private long milliseconds = 0;   private boolean micro = false;   private int rounding = ROUND_TO_SECOND;   /**    * construct a time format    *     *     * @param milliseconds    */   private TimeFormat(long milliseconds, int round) {     this.rounding = round;     this.original = milliseconds;     if (milliseconds >= ONE_SECOND) {       this.remainder = milliseconds;       getTime();     } else {       micro = true;       // if less than second, we'll just       // display       time = milliseconds;     }   }   /**    * construct a time format    *     *     * @param milliseconds    */   private TimeFormat(long milliseconds) {     this(milliseconds, TimeFormat.ROUND_TO_MILLISECOND);   }   /**    * get days    *     * @return days    */   public long getDays() {     return days;   }   /**    * get minutes    *     * @return minutes    */   public long getMinutes() {     return minutes;   }   /**    * get hours    *     * @return hours    */   public long getHours() {     return hours;   }   /**    * get seconds    *     * @return seconds    */   public long getSeconds() {     return seconds;   }   /**    * add a timeformat    *     *     * @param t    */   public void add(TimeFormat t) {     days += t.days;     hours += t.hours;     minutes += t.minutes;     seconds += t.seconds;   }   /**    * get days from a time format    *     *     * @param t    */   public void getDays(TimeFormat t) {     if (t.remainder >= ONE_DAY) {       t.days = (t.remainder / ONE_DAY);       t.remainder -= (t.days * ONE_DAY);     }   }   /**    * get hours from a time format    *     *     * @param t    */   public void getHours(TimeFormat t) {     if (t.remainder >= ONE_HOUR && t.remainder < ONE_DAY) {       t.hours = (t.remainder / ONE_HOUR);       t.remainder -= (t.hours * ONE_HOUR);     }   }   /**    * get minutes from a time format    *     *     * @param t    */   public void getMinutes(TimeFormat t) {     if (t.remainder >= ONE_MINUTE && t.remainder < ONE_HOUR) {       t.minutes = (t.remainder / ONE_MINUTE);       t.remainder -= (t.minutes * ONE_MINUTE);     }   }   /**    * get seconds from a time format    *     *     * @param t    */   public void getSeconds(TimeFormat t) {     if (t.remainder >= ONE_SECOND && t.remainder < ONE_MINUTE) {       t.seconds = (t.remainder / ONE_SECOND);       t.milliseconds = t.remainder -= (t.seconds * ONE_SECOND);     } else {       t.seconds = 0;       t.milliseconds = t.remainder;     }   }   /**    * update time    *     *     * @param t    */   public void getTime(TimeFormat t) {     t.getTime();   }   /**    * update    *     */   private void getTime() {     getDays(this);     getHours(this);     getMinutes(this);     getSeconds(this);   }   /**    * get the milliseconds    */   public long getMilliseconds() {     return (micro ? time : milliseconds);   }   /**    * print out the time format in a string representation    */   public String toString() {     return format(rounding);   }   /**    * set rounding - one of ROUND_TO_MILLISECONDS, etc.    */   public void setRounding(int r) {     rounding = r;   }   /**    * return the rounding    */   public int getRouding() {     return rounding;   }   /**    * format string based on rouding    */   public String format(int round) {     if (DEBUG) {       System.err.println("-->time: " + time + ", round: " + round + ", micro: " + micro           + ",remainder:" + remainder);       System.err.println("-->days: " + days);       System.err.println("-->hours: " + hours);       System.err.println("-->minutes: " + minutes);       System.err.println("-->hours: " + hours);       System.err.println("-->seconds: " + seconds);       System.err.println("-->milliseconds: " + milliseconds);       System.err.flush();     }     switch (round) {     case ROUND_TO_DAY: {       return formatDays(false);     }     case ROUND_TO_HOUR: {       return formatDays(true) + formatHours(false);     }     case ROUND_TO_MINUTE: {       return formatDays(true) + formatHours(true) + formatMinutes(false);     }     case ROUND_TO_SECOND: {       return formatDays(true) + formatHours(true) + formatMinutes(true) + formatSeconds(false);     }     case ROUND_TO_MILLISECOND: {       return formatDays(true) + formatHours(true) + formatMinutes(true) + formatSeconds(true)           + (micro ? time : milliseconds) + " ms";     }     }     return original + " ms";   }   /**    * FIXME: Missing Method declaration    *     *     * @param empty    * @return    */   private String formatDays(boolean empty) {     if (days <= 0) {       return empty ? "" : "0 days";     }     return format("day", "days", days);   }   /**    * FIXME: Missing Method declaration    *     *     * @param empty    * @return    */   private String formatHours(boolean empty) {     if (hours <= 0) {       return empty ? "" : "0 hours";     }     return format("hour", "hours", hours);   }   /**    * FIXME: Missing Method declaration    *     *     * @param empty    * @return    */   private String formatMinutes(boolean empty) {     if (minutes <= 0) {       return empty ? "" : "0 minutes";     }     return format("minute", "minutes", minutes);   }   /**    * FIXME: Missing Method declaration    *     *     * @param empty    * @return    */   private String formatSeconds(boolean empty) {     if (seconds <= 0) {       return empty ? "" : "0 seconds";     }     return format("second", "seconds", seconds);   }   /**    * handle amt formatting    */   private String format(String single, String plural, long amt) {     if (amt > 0) {       return amt + " " + (amt > 1 ? plural : single) + " ";     }     return "";   }   /**    * return a string formatted version of time <code>t</code> rounding to    * <code>round</code>    *     * @param t    * @param round    * @return String value    */   public static String valueOf(long t, int round) {     TimeFormat f = new TimeFormat(t, round);     return f.toString();   }   /**    * return a string formatted version of time <code>t</code> rounding to    * <code>round</code>    *     * @param t    * @param round    * @return String value    */   public static String valueOf(long t) {     return valueOf(t, TimeFormat.ROUND_TO_MILLISECOND);   }   /**    * format with a date time    */   public static String format(String format, long time) {     TimeFormat f = new TimeFormat(time);     return f.parse(format, f.getDays(), f.getHours(), f.getMinutes(), f.getSeconds(), f         .getMilliseconds());   }   /**    * parse    */   private String parse(String format, long day, long hour, long minute, long second, long millis) {     String s = "";     int start = 0;     int len = format.length();     for (int c = 0; c < len; c++) {       char tc = format.charAt(c);       int sc = c;       int l = 0;       switch (tc) {       case ' ': {         s += " ";         break;       }       case '\'': {         while (++c < len && format.charAt(c) != '\'')           ;         s += format.substring(sc + 1, c);         break;       }       case 'D': // days       case 'd':         while (++c < len && (format.charAt(c) == 'd' || format.charAt(c) == 'D'))           ;         l = c - sc;         s += sc <= 0 || start < 0 ? "" : format.substring(start, sc);         s += zeroPad(day, l - 1);         --c;         break;       case 'h': // hours       case 'H':         while (++c < len && (format.charAt(c) == 'h' || format.charAt(c) == 'H'))           ;         l = c - sc;         s += sc <= 0 || start < 0 ? "" : format.substring(start, sc);         s += zeroPad(hour, l - 1);         --c;         break;       case 'm': // minutes       case 'M':         while (++c < len && (format.charAt(c) == 'm' || format.charAt(c) == 'M'))           ;         l = c - sc;         s += sc <= 0 || start < 0 ? "" : format.substring(start, sc);         s += zeroPad(minute, l - 1);         --c;         break;       case 's': // seconds       case 'S':         while (++c < len && (format.charAt(c) == 's' || format.charAt(c) == 'S'))           ;         l = c - sc;         s += sc <= 0 || start < 0 ? "" : format.substring(start, sc);         s += zeroPad(second, l - 1);         --c;         break;       case 'z': // milliseconds       case 'Z':         while (++c < len && (format.charAt(c) == 'z' || format.charAt(c) == 'Z'))           ;         l = c - sc;         s += sc <= 0 || start < 0 ? "" : format.substring(start, sc);         s += zeroPad(millis, l - 1);         --c;         break;       }       start = c + 1;     }     return s;   }   /**    * zero pad a number to len    */   private String zeroPad(long value, int len) {     String s = String.valueOf(value);     int l = s.length();     String r = "";     for (int c = l; c <= len; c++) {       r += "0";     }     return r + s;   }   /**    * test    *     *     * @param args    */   public static void main(String args[]) {     String FORMAT = "D 'days,' HH 'hours,' mm 'minutes and ' ss 'seconds, 'zz 'milliseconds'";     System.out.println(TimeFormat.format(FORMAT, 1000));     System.out.println("ONE SECOND: " + TimeFormat.ONE_SECOND);     System.out.println("ONE MINUTE: " + TimeFormat.ONE_MINUTE);     System.out.println("ONE HOUR:   " + TimeFormat.ONE_HOUR);     System.out.println("ONE DAY:    " + TimeFormat.ONE_DAY);     for (int c = 0; c <= 5; c++) {       System.out.println("Round to: " + c);       System.out.println("Time: " + TimeFormat.valueOf(Long.MAX_VALUE, c));       System.out.println("Time: " + TimeFormat.valueOf(1236371400, c));       System.out.println("Time: " + TimeFormat.format(FORMAT, 1236371400));       System.out.println("Time: " + TimeFormat.valueOf(123613700, c));       System.out.println("Time: " + TimeFormat.valueOf(700, c));       System.out.println("Time: " + TimeFormat.valueOf(2001, c));       System.out.println("Time: " + TimeFormat.valueOf(2101, c));       System.out.println("Time: " + TimeFormat.valueOf(15, c));       System.out.println("Time: " + TimeFormat.valueOf(999, c));       System.out.println("Time: " + TimeFormat.valueOf(10000, c));       System.out.println("Time: " + TimeFormat.valueOf(ONE_MINUTE * 10, c));       System.out.println("Time: " + TimeFormat.valueOf(ONE_DAY * 10 + 101, c));       System.out.println("Time: " + TimeFormat.valueOf(ONE_HOUR * 10, c));       System.out.println("Time: " + TimeFormat.valueOf(ONE_HOUR + ONE_DAY + (ONE_MINUTE * 2), c));       System.out.println("Time: "           + TimeFormat.format(FORMAT, ONE_HOUR + ONE_DAY + (ONE_MINUTE * 2)));     }   } } /**  * $Log: 1 Head - DO NOT USE1.0 12/3/01 2:51:16 PM jhaynie $ Revision 1.2  * 2001/08/31 22:04:24 jhaynie added parsing and formatting features  *   * Revision 1.1 2001/08/29 19:47:53 jhaynie initial checkin  *   */