Skip to content

Instantly share code, notes, and snippets.

@Sythelux
Created March 9, 2016 15:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Sythelux/297a5498201d72d72ac5 to your computer and use it in GitHub Desktop.
Save Sythelux/297a5498201d72d72ac5 to your computer and use it in GitHub Desktop.
converts time on format like: "1d14h5min5sec40ms" to millis or vice versa
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author Sythelux Rikd
*
*/
public class TimeFlowParser {
/** Pattern for time parsing: "(\\d.*d)|(\\d.*h)|(\\d.*min)|(\\d.*sec)|(\\d.*ms)" */
public static final Pattern TIMEPATTERN = Pattern.compile("(\\d.*d)|(\\d.*h)|(\\d.*min)|(\\d.*sec)|(\\d.*ms)");
/** contains entries for d:day, h:hour, min:minute, sec:second, ms:millisecond */
public static final Map<String, TimeUnit> TS_SHORTS = new LinkedHashMap<String, TimeUnit>();
static {
TS_SHORTS.put("d", TimeUnit.DAYS);
TS_SHORTS.put("h", TimeUnit.HOURS);
TS_SHORTS.put("min", TimeUnit.MINUTES);
TS_SHORTS.put("sec", TimeUnit.SECONDS);
TS_SHORTS.put("ms", TimeUnit.MILLISECONDS);
}
/** parse a String that is like Pattern. Examples:
* <ul>
* <li>"1000ms"</li>
* <li>"15sec"</li>
* <li>"5min"</li>
* <li>"5sec340ms"</li>
* <li>"5min5sec40ms"</li>
* <li>"1d14h5min5sec40ms"</li>
* </ul>
*
* @param timeString a String that can be parsed from pattern above
* @return long milliseconds*/
public static long Parse(String timeString) {
long millis = 0;
Matcher matcher = TIMEPATTERN.matcher(timeString);
while (matcher.find()) {
String group = matcher.group();
int tempTime = Integer.parseInt(group.replaceAll("\\D", ""));
TimeUnit tempTU = TS_SHORTS.get(group.replaceAll("\\d", ""));
millis += tempTU.toMillis(tempTime);
}
return millis;
}
/**
* converts millis to a string that is compatible to Pattern above
* @param millis millliseconds in long
* @return String like "1d14h5min5sec40ms"
*/
public static String Build(long millis) {
String retVal = "";
long[] vals = new long[TS_SHORTS.size()];
int i = 0;
for (Entry<String, TimeUnit> entry : TS_SHORTS.entrySet()) {
vals[i] = entry.getValue().convert(millis, TimeUnit.MILLISECONDS);
millis -= entry.getValue().toMillis(vals[i]);
if (vals[i] != 0) {
retVal += vals[i] + entry.getKey();
}
i++;
}
return retVal;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment