diff --git a/common/source/java/ch/systemsx/cisd/common/time/DateTimeUtils.java b/common/source/java/ch/systemsx/cisd/common/time/DateTimeUtils.java index c8dd7c90f1974719726bb0c03cb7bda5001977e0..b8e9e725b64415c8054d8973fd41887613724108 100644 --- a/common/source/java/ch/systemsx/cisd/common/time/DateTimeUtils.java +++ b/common/source/java/ch/systemsx/cisd/common/time/DateTimeUtils.java @@ -19,6 +19,8 @@ package ch.systemsx.cisd.common.time; import java.text.DateFormat; import java.util.Calendar; import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.commons.lang.time.DateUtils; @@ -30,6 +32,16 @@ import org.apache.commons.lang.time.DateUtils; */ public final class DateTimeUtils { + private static final Pattern secPattern = Pattern.compile("([0-9]+)\\s*(|s|sec)"); + + private static final Pattern minPattern = Pattern.compile("([0-9]+) *(m|min)"); + + private static final Pattern hourPattern = Pattern.compile("([0-9]+) *(h|hours)"); + + private static final Pattern dayPattern = Pattern.compile("([0-9]+) *(d|days)"); + + private static final Pattern milliPattern = Pattern.compile("([0-9]+) *(ms|msec)"); + /** * Returns the time zone in the following form: <code>GMT+01:00</code> (could not be easily * performed using {@link DateFormat}). @@ -96,6 +108,56 @@ public final class DateTimeUtils return value + unit; } + /** + * Parses a time duration to milli-seconds. The string will be trimmed and white spaces in + * between number and unit are ignored. Accepted numbers are: + * <ul> + * <li>ms, msec: milli-seconds</li> + * <li>s, sec or nothing: seconds</li> + * <li>m, min: minutes</li> + * <li>h, hours: hours</li> + * <li>d, days: days</li> + * </ul> + */ + public static long parseDurationToMillis(String durationStr) + { + final String durationStrTrimmed = durationStr.trim(); + Matcher m; + m = secPattern.matcher(durationStrTrimmed); + if (m.matches()) + { + return Long.parseLong(m.group(1)) * 1000L; + } + m = minPattern.matcher(durationStrTrimmed); + if (m.matches()) + { + return Long.parseLong(m.group(1)) * 60 * 1000L; + } + m = hourPattern.matcher(durationStrTrimmed); + if (m.matches()) + { + return Long.parseLong(m.group(1)) * 3600 * 1000L; + } + m = dayPattern.matcher(durationStrTrimmed); + if (m.matches()) + { + return Long.parseLong(m.group(1)) * 24 * 3600 * 1000L; + } + m = dayPattern.matcher(durationStrTrimmed); + if (m.matches()) + { + return Long.parseLong(m.group(1)) * 24 * 3600 * 1000L; + } + m = milliPattern.matcher(durationStrTrimmed); + if (m.matches()) + { + return Long.parseLong(m.group(1)); + } + + throw new IllegalArgumentException(String.format("'%s' is not a valid duration", + durationStrTrimmed)); + } + /** * Extends the given <var>date</var> until the end of the day. */ diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/time/DateTimeUtilsTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/time/DateTimeUtilsTest.java index 2d2ef1d3a4b64c16ef53b1ad66ffa83cf4c6e462..f41f8edd30dcc0ddbc4d3fc58e4093b9a4a2f754 100644 --- a/common/sourceTest/java/ch/systemsx/cisd/common/time/DateTimeUtilsTest.java +++ b/common/sourceTest/java/ch/systemsx/cisd/common/time/DateTimeUtilsTest.java @@ -48,6 +48,80 @@ public class DateTimeUtilsTest extends AssertJUnit assertEquals("1h 1min", DateTimeUtils.renderDuration(61 * 1000 * 60)); assertEquals("2h 3min", DateTimeUtils.renderDuration(123 * 1000 * 60)); } + + @Test + public void testParseDurationSecs() + { + assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51s")); + assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51s ")); + assertEquals(51000L, DateTimeUtils.parseDurationToMillis(" 51s")); + assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51 s")); + assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51 s")); + assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51sec")); + assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51 sec")); + assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51 sec")); + assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51")); + assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51 ")); + assertEquals(51000L, DateTimeUtils.parseDurationToMillis(" 51")); + } + + @Test + public void testParseDurationMins() + { + assertEquals(360000L, DateTimeUtils.parseDurationToMillis("6m")); + assertEquals(360000L, DateTimeUtils.parseDurationToMillis("6m ")); + assertEquals(360000L, DateTimeUtils.parseDurationToMillis(" 6m")); + assertEquals(360000L, DateTimeUtils.parseDurationToMillis("6 m")); + assertEquals(360000L, DateTimeUtils.parseDurationToMillis("6 m")); + assertEquals(360000L, DateTimeUtils.parseDurationToMillis("6min")); + assertEquals(360000L, DateTimeUtils.parseDurationToMillis("6 min")); + assertEquals(360000L, DateTimeUtils.parseDurationToMillis("6 min")); + } + + @Test + public void testParseDurationHours() + { + assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("6h")); + assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("6h ")); + assertEquals(21600000L, DateTimeUtils.parseDurationToMillis(" 6h")); + assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("6 h")); + assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("6 h")); + assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("6hours")); + assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("6 hours")); + assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("6 hours")); + } + + @Test + public void testParseDurationDays() + { + assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("3d")); + assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("3d ")); + assertEquals(259200000L, DateTimeUtils.parseDurationToMillis(" 3d")); + assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("3 d")); + assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("3 d")); + assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("3days")); + assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("3 days")); + assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("3 days")); + } + + @Test + public void testParseDurationMillis() + { + assertEquals(13L, DateTimeUtils.parseDurationToMillis("13ms")); + assertEquals(13L, DateTimeUtils.parseDurationToMillis("13ms ")); + assertEquals(13L, DateTimeUtils.parseDurationToMillis(" 13ms")); + assertEquals(13L, DateTimeUtils.parseDurationToMillis("13 ms")); + assertEquals(13L, DateTimeUtils.parseDurationToMillis("13 ms")); + assertEquals(13L, DateTimeUtils.parseDurationToMillis("13msec")); + assertEquals(13L, DateTimeUtils.parseDurationToMillis("13 msec")); + assertEquals(13L, DateTimeUtils.parseDurationToMillis("13 msec")); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testParseInvalidDuration() + { + DateTimeUtils.parseDurationToMillis("3867bla"); + } @Test public void testExtendUntilEndOfDay() throws ParseException