You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
4.1 KiB
191 lines
4.1 KiB
package com.mousetech.gourmetj.utils;
|
|
|
|
import java.util.Scanner;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
/**
|
|
* Handle conversion of complex time fields where days, hours,
|
|
* minutes and seconds may be present as separate entities.
|
|
*
|
|
* @author timh
|
|
* @since Jan 8, 2022
|
|
*/
|
|
public class TimeFormatter {
|
|
|
|
/* Logger */
|
|
|
|
private static final Logger log =
|
|
LoggerFactory.getLogger(TimeFormatter.class);
|
|
|
|
/**
|
|
* Format time to day, hours, minutes, secs.
|
|
* @param ltime interval in milliseconds
|
|
* @return Formatted time string.
|
|
*/
|
|
public static String formatTime(Long ltime) {
|
|
if (ltime == null) {
|
|
return "";
|
|
}
|
|
int time = ltime.intValue()/1000;
|
|
int dd, hh, mm, ss;
|
|
ss = time % 60;
|
|
time /= 60;
|
|
mm = time % 60;
|
|
time /= 60;
|
|
hh = time % 24;
|
|
dd = time / 24;
|
|
StringBuffer sb = new StringBuffer(20);
|
|
if (dd > 0) {
|
|
sb.append(dd).append("d ");
|
|
}
|
|
if (hh > 0) {
|
|
sb.append(hh).append("h ");
|
|
}
|
|
if (mm > 0) {
|
|
sb.append(mm);
|
|
if ((ss == 0) && (hh == 0)) {
|
|
if ( mm == 1 ) {
|
|
sb.append(" minute");
|
|
} else {
|
|
sb.append(" minutes");
|
|
}
|
|
} else {
|
|
sb.append("min. ");
|
|
}
|
|
}
|
|
if (ss > 0) {
|
|
sb.append(ss).append("sec. ");
|
|
}
|
|
return sb.toString().trim();
|
|
}
|
|
|
|
/**
|
|
* Regex-heavy digester of time values (optional) and units.
|
|
* @author timh
|
|
* @since Jan 10, 2022
|
|
*/
|
|
private static class TimeMuncher {
|
|
|
|
public class MunchException extends Exception {
|
|
|
|
/**
|
|
*
|
|
*/
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
}
|
|
|
|
final private String SPAT_DAYS = "days?|d";
|
|
final private String SPAT_HOURS = "hours?|h|hr";
|
|
final private String SPAT_MINUTES = "minutes?|mins?|m";
|
|
final private String SPAT_SECONDS = "seconds?|secs?|s";
|
|
|
|
final Pattern pat_number;
|
|
final Pattern pat_days;
|
|
final Pattern pat_hours;
|
|
final Pattern pat_mins;
|
|
final Pattern pat_secs;
|
|
|
|
final Scanner scanner;
|
|
|
|
public TimeMuncher(String timestr) {
|
|
pat_number =
|
|
Pattern.compile("(\\d[\\,\\.]?\\d*)?(.*)");
|
|
// Compile here for future I18N support
|
|
pat_days = Pattern.compile(SPAT_DAYS);
|
|
pat_hours = Pattern.compile(SPAT_HOURS);
|
|
pat_mins = Pattern.compile(SPAT_MINUTES);
|
|
pat_secs = Pattern.compile(SPAT_SECONDS);
|
|
|
|
scanner = new Scanner(timestr);
|
|
scanner.useDelimiter("\\W");
|
|
}
|
|
|
|
public Long scan() {
|
|
Double sum = null;
|
|
Double dvalue = null;
|
|
|
|
try {
|
|
while (scanner.hasNext()) {
|
|
if (scanner.hasNextDouble()) {
|
|
dvalue = scanner.nextDouble();
|
|
} else {
|
|
String units = scanner.next();
|
|
sum = setSum(sum, dvalue, units);
|
|
dvalue = null;
|
|
}
|
|
}
|
|
} catch (MunchException e) {
|
|
log.warn("Unparseable time value");
|
|
e.printStackTrace();
|
|
}
|
|
if (sum == null) {
|
|
return null;
|
|
}
|
|
return sum.longValue();
|
|
}
|
|
|
|
private Double setSum(Double sum, Double dvalue,
|
|
String units) throws MunchException {
|
|
Matcher m;
|
|
|
|
m = pat_number.matcher(units);
|
|
|
|
if (!m.matches()) {
|
|
throw new MunchException();
|
|
}
|
|
if (m.group(1) != null) {
|
|
String a = m.group(1);
|
|
if (dvalue != null) {
|
|
throw new MunchException();
|
|
}
|
|
dvalue = Double
|
|
.valueOf(a);
|
|
//units = units.substring(m.end());
|
|
}
|
|
units = m.group(2);
|
|
m = pat_days.matcher(units);
|
|
if (m.matches()) {
|
|
return addToSum(sum, dvalue,
|
|
24L * 60L * 60L * 1000L);
|
|
}
|
|
m = pat_hours.matcher(units);
|
|
if (m.matches()) {
|
|
return addToSum(sum, dvalue, 60L * 60L * 1000L);
|
|
}
|
|
m = pat_mins.matcher(units);
|
|
if (m.matches()) {
|
|
return addToSum(sum, dvalue, 60L * 1000L);
|
|
}
|
|
m = pat_secs.matcher(units);
|
|
if (m.matches()) {
|
|
return addToSum(sum, dvalue, 1000L);
|
|
}
|
|
return sum;
|
|
}
|
|
|
|
private Double addToSum(Double sum, Double dvalue,
|
|
long l) throws MunchException {
|
|
if (dvalue == null) {
|
|
throw new TimeMuncher.MunchException();
|
|
}
|
|
dvalue *= l;
|
|
if (sum == null) {
|
|
sum = 0.0;
|
|
}
|
|
sum += dvalue;
|
|
return sum;
|
|
}
|
|
}
|
|
|
|
public static Long parseTime(String timestr) {
|
|
TimeMuncher muncher = new TimeMuncher(timestr);
|
|
|
|
Long interval = muncher.scan();
|
|
return interval;
|
|
}
|
|
}
|
|
|