fork download
  1. import java.time.*;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4.  
  5. public class Main {
  6. public static void main(String[] args) {
  7. Duration duration = Duration.between(
  8. ZonedDateTime.now().minusHours(4).minusMinutes(1).minusSeconds(40),
  9. ZonedDateTime.now()
  10. );
  11. System.out.println(formatDuration(duration));
  12.  
  13. // Example for '... later'
  14. duration = Duration.between(
  15. ZonedDateTime.now().plusHours(4).plusMinutes(1).plusSeconds(40),
  16. ZonedDateTime.now()
  17. );
  18. System.out.println(formatDuration(duration));
  19. }
  20.  
  21. static String formatDuration(Duration duration) {
  22. //################# Java 9 onwards ###################
  23. String formatted = List.of(fmtHr(Math.abs(duration.toHoursPart())),
  24. fmtMin(Math.abs(duration.toMinutesPart())),
  25. fmtSec(Math.abs(duration.toSecondsPart()))
  26. ).stream().collect(Collectors.joining(", "));
  27. //#####################################################
  28.  
  29. return formatted += duration.toHoursPart() >= 0 ? " ago." : " later.";
  30. }
  31.  
  32. static String fmtHr(long hr) {
  33. return String.format("%d %s", hr, hr <= 1 ? "hour" : "hours");
  34. }
  35.  
  36. static String fmtMin(long min) {
  37. return String.format("%d %s", min, min <= 1 ? "minute" : "minutes");
  38. }
  39.  
  40. static String fmtSec(long sec) {
  41. return String.format("%d %s", sec, sec <= 1 ? "second" : "seconds");
  42. }
  43. }
Success #stdin #stdout 0.19s 61424KB
stdin
Standard input is empty
stdout
4 hours, 1 minute, 40 seconds ago.
4 hours, 1 minute, 40 seconds later.