A utility class for converting a long into a human readable string. : Long « Data Type « Java Tutorial






/*
 * 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.
 * 
 * 
 * 
 * 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
 * 
 */








2.8.Long
2.8.1.Long Integer Literal
2.8.2.Create a Long object
2.8.3.Add two long integers, checking for overflow.
2.8.4.Multiply two long integers, checking for overflow.
2.8.5.Subtract two long integers, checking for overflow.
2.8.6.Convert Long to numeric primitive data types example
2.8.7.Convert long primitive to Long object Example
2.8.8.Compute distance light travels using long variables
2.8.9.Java long Example: long is 64 bit signed type
2.8.10.Min and Max values of datatype long
2.8.11.Gets the maximum of three long values.
2.8.12.Gets the minimum of three long values.
2.8.13.Convert Java String to Long example
2.8.14.Use toString method of Long class to convert Long into String.
2.8.15.Convert from long to String
2.8.16.Convert from String to long
2.8.17.A utility class for converting a long into a human readable string.
2.8.18.Java Sort long Array Example
2.8.19.Compare Two Java long Arrays Example
2.8.20.Format long with System.out.format