Java tutorial
/* TimeUtil.java / Freenet Copyright (C) 2005-2006 The Free Network project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ //package freenet.support; import java.text.DecimalFormat; /** * Time formatting utility. * Formats milliseconds into a week/day/hour/second/milliseconds string. */ public class TimeUtil { /** * It converts a given time interval into a * week/day/hour/second.milliseconds string. * @param timeInterval interval to convert * @param maxTerms the terms number to display * (e.g. 2 means "h" and "m" if the time could be expressed in hour, * 3 means "h","m","s" in the same example). * The maximum terms number available is 6 * @param withSecondFractions if true it displays seconds.milliseconds * @return the formatted String */ public static String formatTime(long timeInterval, int maxTerms, boolean withSecondFractions) { if (maxTerms > 6) throw new IllegalArgumentException(); StringBuilder sb = new StringBuilder(64); long l = timeInterval; int termCount = 0; // if (l < 0) { sb.append('-'); l = l * -1; } if (!withSecondFractions && l < 1000) { return "0"; } if (termCount >= maxTerms) { return sb.toString(); } // long weeks = (l / (7L * 24 * 60 * 60 * 1000)); if (weeks > 0) { sb.append(weeks).append('w'); termCount++; l = l - (weeks * (7L * 24 * 60 * 60 * 1000)); } if (termCount >= maxTerms) { return sb.toString(); } // long days = (l / (24L * 60 * 60 * 1000)); if (days > 0) { sb.append(days).append('d'); termCount++; l = l - (days * (24L * 60 * 60 * 1000)); } if (termCount >= maxTerms) { return sb.toString(); } // long hours = (l / (60L * 60 * 1000)); if (hours > 0) { sb.append(hours).append('h'); termCount++; l = l - (hours * (60L * 60 * 1000)); } if (termCount >= maxTerms) { return sb.toString(); } // long minutes = (l / (60L * 1000)); if (minutes > 0) { sb.append(minutes).append('m'); termCount++; l = l - (minutes * (60L * 1000)); } if (termCount >= maxTerms) { return sb.toString(); } if (withSecondFractions && ((maxTerms - termCount) >= 2)) { if (l > 0) { double fractionalSeconds = l / (1000.0D); DecimalFormat fix3 = new DecimalFormat("0.000"); sb.append(fix3.format(fractionalSeconds)).append('s'); termCount++; //l = l - ((long)fractionalSeconds * (long)1000); } } else { long seconds = (l / 1000L); if (seconds > 0) { sb.append(seconds).append('s'); termCount++; //l = l - ((long)seconds * (long)1000); } } // return sb.toString(); } public static String formatTime(long timeInterval) { return formatTime(timeInterval, 2, false); } public static String formatTime(long timeInterval, int maxTerms) { return formatTime(timeInterval, maxTerms, false); } } /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package freenet.support; import java.util.Locale; import junit.framework.TestCase; /** * Test case for {@link freenet.support.TimeUtil} class. * * @author Alberto Bacchelli <sback@freenetproject.org> */ public class TimeUtilTest extends TestCase { //1w+1d+1h+1m+1s+1ms private long oneForTermLong = 694861001; @Override protected void setUp() throws Exception { Locale.setDefault(Locale.US); } /** * Tests formatTime(long,int,boolean) method * trying the biggest long value */ public void testFormatTime_LongIntBoolean_MaxValue() { String expectedForMaxLongValue = "15250284452w3d7h12m55.807s"; assertEquals(TimeUtil.formatTime(Long.MAX_VALUE, 6, true), expectedForMaxLongValue); } /** * Tests formatTime(long,int) method * trying the biggest long value */ public void testFormatTime_LongInt() { String expectedForMaxLongValue = "15250284452w3d7h12m55s"; assertEquals(TimeUtil.formatTime(Long.MAX_VALUE, 6), expectedForMaxLongValue); } /** * Tests formatTime(long) method * trying the biggest long value */ public void testFormatTime_Long() { //it uses two terms by default String expectedForMaxLongValue = "15250284452w3d"; assertEquals(TimeUtil.formatTime(Long.MAX_VALUE), expectedForMaxLongValue); } /** * Tests formatTime(long) method * using known values. * They could be checked using Google Calculator * http://www.google.com/intl/en/help/features.html#calculator */ public void testFormatTime_KnownValues() { Long methodLong; String[][] valAndExpected = { //one week { "604800000", "1w" }, //one day { "86400000", "1d" }, //one hour { "3600000", "1h" }, //one minute { "60000", "1m" }, //one second { "1000", "1s" } }; for (int i = 0; i < valAndExpected.length; i++) { methodLong = Long.valueOf(valAndExpected[i][0]); assertEquals(TimeUtil.formatTime(methodLong.longValue()), valAndExpected[i][1]); } } /** * Tests formatTime(long,int) method * using a long value that generate every possible * term kind. It tests if the maxTerms arguments * works correctly */ public void testFormatTime_LongIntBoolean_maxTerms() { String[] valAndExpected = { //0 terms "", //1 term "1w", //2 terms "1w1d", //3 terms "1w1d1h", //4 terms "1w1d1h1m", //5 terms "1w1d1h1m1s", //6 terms "1w1d1h1m1.001s" }; for (int i = 0; i < valAndExpected.length; i++) assertEquals(TimeUtil.formatTime(oneForTermLong, i, true), valAndExpected[i]); } /** * Tests formatTime(long,int) method * using one millisecond time interval. * It tests if the withSecondFractions argument * works correctly */ public void testFormatTime_LongIntBoolean_milliseconds() { long methodValue = 1; //1ms assertEquals(TimeUtil.formatTime(methodValue, 6, false), "0"); assertEquals(TimeUtil.formatTime(methodValue, 6, true), "0.001s"); } /** * Tests formatTime(long,int) method * using a long value that generate every possible * term kind. It tests if the maxTerms arguments * works correctly */ public void testFormatTime_LongIntBoolean_tooManyTerms() { try { TimeUtil.formatTime(oneForTermLong, 7); fail("Expected IllegalArgumentException not thrown"); } catch (IllegalArgumentException anException) { assertNotNull(anException); } } }