diff --git a/LoadingBar.java b/LoadingBar.java index 67f6706..3a32d5f 100644 --- a/LoadingBar.java +++ b/LoadingBar.java @@ -380,17 +380,17 @@ public class LoadingBar { private static void showLoadingBar(LocalTime startTime, LocalTime endTime) { - long initialMinutes = startTime.until(endTime, ChronoUnit.MINUTES); - System.out.print(minutesToTimeString(initialMinutes) + " gesamt; Endzeit: " + TIME_FORMATTER.format(endTime) + "\n"); - long passedMinutes = startTime.until(LocalTime.now(), ChronoUnit.MINUTES); - if (passedMinutes > initialMinutes) { - passedMinutes = initialMinutes; + long totalMinutes = startTime.until(endTime, ChronoUnit.MINUTES); + long passedMinutes = startTime.until(LocalTime.now().truncatedTo(ChronoUnit.MINUTES), ChronoUnit.MINUTES); + if (passedMinutes > totalMinutes) { + passedMinutes = totalMinutes; } else if (passedMinutes < 0) { - System.out.println(fillLoadingBar(initialMinutes, 0, false)); - return; + var now = LocalTime.now().truncatedTo(ChronoUnit.SECONDS); + System.out.println("!ACHTUNG! Startzeit \"" + startTime + ":00\" liegt in der Zukunft von jetzt an (" + now + ") gesehen."); } - while (passedMinutes < initialMinutes) { - System.out.print(fillLoadingBar(initialMinutes, passedMinutes, true)); + System.out.println(minutesToTimeString(totalMinutes) + " gesamt; Endzeit: " + TIME_FORMATTER.format(endTime)); + while (passedMinutes < totalMinutes) { + System.out.print(fillLoadingBar(totalMinutes, passedMinutes, true)); try { var now = LocalTime.now(); var oneMinuteLater = now.plusMinutes(1).truncatedTo(ChronoUnit.MINUTES); @@ -402,15 +402,15 @@ public class LoadingBar { } passedMinutes++; } - System.out.println(fillLoadingBar(initialMinutes, passedMinutes, false)); + System.out.println(fillLoadingBar(totalMinutes, passedMinutes, false)); } - private static String fillLoadingBar(long initialMinutes, long passedMinutes, boolean progressive) { + private static String fillLoadingBar(long totalMinutes, long passedMinutes, boolean progressive) { + var nonNegativePassedMinutes = passedMinutes < 0 ? 0 : passedMinutes; BigDecimal wholePercentage = BigDecimal.valueOf(100) - .multiply(BigDecimal.valueOf(passedMinutes) // kind of reverse dreisatz to avoid to have e.g. 99.9999 instead of 100 % - .divide(BigDecimal.valueOf(initialMinutes), MathContext.DECIMAL64)); - long remainingMinutes = initialMinutes - passedMinutes; + .multiply( // kind of reverse dreisatz to avoid to have e.g. 99.9999 instead of 100 % + BigDecimal.valueOf(nonNegativePassedMinutes).divide(BigDecimal.valueOf(totalMinutes), MathContext.DECIMAL64)); int numberOfEquals = wholePercentage.intValue(); var sb = new StringBuilder("["); for (int i = 0; i < LINE_LENGTH; i++) { @@ -420,8 +420,9 @@ public class LoadingBar { sb.append("-"); } } + long remainingMinutes = totalMinutes - nonNegativePassedMinutes; sb.append("] ").append(PERCENTAGE_FORMAT.format(wholePercentage)).append("% ") - .append(minutesToTimeString(passedMinutes)).append(" - ").append(minutesToTimeString(remainingMinutes)); + .append(minutesToTimeString(nonNegativePassedMinutes)).append(" - ").append(minutesToTimeString(remainingMinutes)); if (progressive) { sb.append("\r"); }