Created
March 24, 2019 16:57
-
-
Save KoalaOnCaffeine/e86dc97559b892c3b0e53d99d6caf76a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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