Skip to content

Instantly share code, notes, and snippets.

@KoalaOnCaffeine
Created March 24, 2019 16:57
Show Gist options
  • Save KoalaOnCaffeine/e86dc97559b892c3b0e53d99d6caf76a to your computer and use it in GitHub Desktop.
Save KoalaOnCaffeine/e86dc97559b892c3b0e53d99d6caf76a to your computer and use it in GitHub Desktop.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public final class TimeParser {
private static final long MINUTE = 60;
private static final long HOUR = MINUTE * 60;
private static final long DAY = HOUR * 24;
private static final long WEEK = DAY * 7;
private static final long MONTH = DAY * 30;
private static final long YEAR = DAY * 365;
public static Time toSeconds(String from) {
List<String> letters = Arrays.asList(from.split("\\d")).stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
List<String> values = Arrays.asList(from.split("\\D"));
if (letters.size() != values.size())
return new Time(0);
long out = 0L;
for (int i = 0; i < letters.size(); i++) {
long value = Long.parseLong(values.get(i));
switch (letters.get(i)) {
case "s":
out += value;
break;
case "m":
out += MINUTE * value;
break;
case "h":
out += HOUR * value;
break;
case "d":
out += DAY * value;
break;
case "w":
out += WEEK * value;
break;
case "M":
out += MONTH * value;
break;
case "y":
out += YEAR * value;
break;
default:
continue;
}
}
return new Time(out);
}
public static String format(long seconds) {
String out = "";
boolean hasPrev = false;
int holder;
if (seconds >= YEAR) {
hasPrev = true;
holder = (int) (seconds / YEAR);
out += holder + (holder > 1 ? " years " : " year ");
seconds -= holder * YEAR;
}
if (seconds >= MONTH) {
hasPrev = true;
holder = (int) (seconds / MONTH);
out += holder + (holder > 1 ? " months " : " month ");
seconds -= holder * MONTH;
}
if (seconds >= WEEK) {
hasPrev = true;
holder = (int) (seconds / WEEK);
out += holder + (holder > 1 ? " weeks " : " week ");
seconds -= holder * WEEK;
}
if (seconds >= DAY) {
hasPrev = true;
holder = (int) (seconds / DAY);
out += holder + (holder > 1 ? " days " : " day ");
seconds -= holder * DAY;
}
if (seconds >= HOUR) {
hasPrev = true;
holder = (int) (seconds / HOUR);
out += holder + (holder > 1 ? " hours " : " hour ");
seconds -= holder * HOUR;
}
if (seconds >= MINUTE) {
hasPrev = true;
holder = (int) (seconds / MINUTE);
out += holder + (holder > 1 ? " minutes " : " minute ");
seconds -= holder * MINUTE;
}
if (seconds > 0) {
out += (hasPrev ? "and " : "") + seconds + (seconds > 1 ? " seconds" : " second");
hasPrev = true;
}
if (!hasPrev) return "0 seconds";
return out.trim();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment