fork(1) download
  1. import java.time.ZoneId;
  2. import java.time.ZonedDateTime;
  3. import java.util.Scanner;
  4.  
  5. public class Main {
  6.  
  7. static final long NANOS_PER_SECOND = 1000_000_000L;
  8. static final long NANOS_PER_MINUTE = NANOS_PER_SECOND * 60;
  9. static final long NANOS_PER_HOUR = NANOS_PER_MINUTE * 60;
  10. static final long NANOS_PER_WORKED_DAY = NANOS_PER_HOUR * 8;
  11. static final long NANOS_PER_HALF_DAY = NANOS_PER_HOUR * 12;
  12. static final long NANOS_PER_DAY = NANOS_PER_HOUR * 24;
  13.  
  14. public static void main(String[] args) {
  15. try (Scanner sc = new Scanner(System.in)) {
  16. sc.useDelimiter("(?i)([ :]|(?<=\\d)(?=[ap]))");
  17.  
  18. // Read input
  19. long checkIn = sc.nextInt() * NANOS_PER_HOUR + sc.nextInt() * NANOS_PER_MINUTE;
  20. if (!sc.hasNextDouble()) {
  21. if (sc.next().equalsIgnoreCase("pm")) {
  22. checkIn += NANOS_PER_HALF_DAY;
  23. }
  24. }
  25. long total = (long) (sc.nextDouble() * NANOS_PER_HOUR);
  26.  
  27. // Do some calculations
  28. long required = NANOS_PER_WORKED_DAY - total % NANOS_PER_WORKED_DAY;
  29. long now = ZonedDateTime.now(ZoneId.of("America/Mexico_City")).toLocalTime().toNanoOfDay();
  30. long elapsed = total + (checkIn > now
  31. ? NANOS_PER_DAY - checkIn + now
  32. : now - checkIn);
  33.  
  34. // Produce output
  35. System.out.printf("Tiempo transcurrido: %02dh%02dm%02fs%n",
  36. elapsed / NANOS_PER_HOUR,
  37. elapsed % NANOS_PER_HOUR / NANOS_PER_MINUTE,
  38. elapsed % NANOS_PER_MINUTE / (double) NANOS_PER_SECOND);
  39. System.out.printf("Salida a las: %02d:%02d%n",
  40. (checkIn + required) / NANOS_PER_HOUR,
  41. (checkIn + required) % NANOS_PER_HOUR / NANOS_PER_MINUTE);
  42. }
  43. }
  44.  
  45. }
Success #stdin #stdout 0.26s 321216KB
stdin
01:33pm 25.58
stdout
Tiempo transcurrido: 34h39m19.477000s
Salida a las: 19:58