Refactorization of the TimeUtil utility class (#423)

* Refactored `TimeUtil` utility class.

* Minimized `TimeUtil#getRemaining`.
* Fixed a bug regarding how days and hours were calculated in `TimeUtil#getTime`.
* Ditched the use of `int`s and use `long`s instead.

* Implemented `int`-taking methods because my dumb ass didn't think it would break.
This commit is contained in:
Federico López 2020-08-06 14:43:14 -03:00 committed by GitHub
parent 722e987b93
commit 8698449e5d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -22,150 +22,75 @@ package me.clip.placeholderapi.util;
import java.time.Duration; import java.time.Duration;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.StringJoiner;
public class TimeUtil { public class TimeUtil {
public static String getRemaining(int seconds, TimeFormat type) { public static String getRemaining(final int seconds, final TimeFormat type) {
if (seconds < 60) { return getRemaining((long) seconds, type);
switch (type) {
case DAYS:
case HOURS:
case MINUTES:
return "0";
case SECONDS:
return String.valueOf(seconds);
}
return String.valueOf(seconds);
}
int minutes = seconds / 60;
int s = 60 * minutes;
int secondsLeft = seconds - s;
if (minutes < 60) {
switch (type) {
case DAYS:
case HOURS:
return "0";
case MINUTES:
return String.valueOf(minutes);
case SECONDS:
return String.valueOf(secondsLeft);
}
return String.valueOf(seconds);
}
if (minutes < 1440) {
int hours = minutes / 60;
int inMins = 60 * hours;
int leftOver = minutes - inMins;
switch (type) {
case DAYS:
return "0";
case HOURS:
return String.valueOf(hours);
case MINUTES:
return String.valueOf(leftOver);
case SECONDS:
return String.valueOf(secondsLeft);
}
return String.valueOf(seconds);
}
int days = minutes / 1440;
int inMins = 1440 * days;
int leftOver = minutes - inMins;
if (leftOver < 60) {
switch (type) {
case DAYS:
return String.valueOf(days);
case HOURS:
return String.valueOf(0);
case MINUTES:
return String.valueOf(leftOver);
case SECONDS:
return String.valueOf(secondsLeft);
}
return String.valueOf(seconds);
} else {
int hours = leftOver / 60;
int hoursInMins = 60 * hours;
int minsLeft = leftOver - hoursInMins;
switch (type) {
case DAYS:
return String.valueOf(days);
case HOURS:
return String.valueOf(hours);
case MINUTES:
return String.valueOf(minsLeft);
case SECONDS:
return String.valueOf(secondsLeft);
}
return String.valueOf(seconds);
}
} }
public static String getTime(int seconds) { public static String getRemaining(final long seconds, final TimeFormat type) {
return getTime(Duration.ofSeconds(seconds)); switch (type) {
default:
return String.valueOf(seconds);
case SECONDS:
return String.valueOf(seconds % 60);
case MINUTES:
return String.valueOf((seconds / 60) % 60);
case HOURS:
return String.valueOf((seconds / 3600) % 24);
case DAYS:
return String.valueOf(seconds / 86400);
}
} }
/** /**
* Format the given value with s, m, h and d (seconds, minutes, hours and days) * Format the given value with s, m, h and d (seconds, minutes, hours and days)
* *
* @param duration {@link Duration} (eg, Duration.of(20, {@link ChronoUnit#SECONDS}) for 20 * @param duration {@link Duration} (eg, Duration.of(20, {@link ChronoUnit#SECONDS}) for 20
* seconds) * seconds)
* @return formatted time * @return formatted time
*/ */
public static String getTime(final Duration duration) { public static String getTime(final Duration duration) {
final StringBuilder builder = new StringBuilder(); return getTime(duration.getSeconds());
}
public static String getTime(final int seconds) {
return getTime((long) seconds);
}
public static String getTime(long seconds) {
final StringJoiner joiner = new StringJoiner(" ");
long seconds = duration.getSeconds();
long minutes = seconds / 60; long minutes = seconds / 60;
long hours = minutes / 60; long hours = minutes / 60;
long days = hours / 24; final long days = hours / 24;
seconds %= 60; seconds %= 60;
minutes %= 60; minutes %= 60;
hours %= 60; hours %= 24;
days %= 24;
if (seconds > 0) { if (days > 0) {
builder.insert(0, seconds + "s"); joiner.add(days + "d");
}
if (minutes > 0) {
if (builder.length() > 0) {
builder.insert(0, ' ');
}
builder.insert(0, minutes + "m");
} }
if (hours > 0) { if (hours > 0) {
if (builder.length() > 0) { joiner.add(hours + "h");
builder.insert(0, ' ');
}
builder.insert(0, hours + "h");
} }
if (days > 0) { if (minutes > 0) {
if (builder.length() > 0) { joiner.add(minutes + "m");
builder.insert(0, ' ');
}
builder.insert(0, days + "d");
} }
return builder.toString(); if (seconds > 0) {
joiner.add(seconds + "s");
}
return joiner.toString();
} }
} }