Skip to content
Snippets Groups Projects
Commit 91a2519b authored by brinn's avatar brinn
Browse files

Add method DateTimeUtils.parseDurationToMillis().

SVN: 28171
parent adcdc2df
No related branches found
No related tags found
No related merge requests found
......@@ -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.
*/
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment