Как получить время выполнения активной задачи в соответствии с ее GMT ​​lanuchTime в Spark?

Я хочу получить время выполнения активной задачи. На странице API REST /applications/[app-id]/stages/[stage-id]Я могу получить информацию о задачах в деталях.

введите описание изображения здесь

Вы можете увидеть, executorRunTime 0, когда задача не завершена. Я думаю, что я могу получить время выполнения в соответствии с launchTime, Предположим, launchTime это 2017-12-21T03:15:31.106GMT. Я использую следующий код для вычисления runTime.

val format = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'.'sss'GMT'", Locale.ENGLISH)
format.setTimeZone(TimeZone.getTimeZone("GMT"))
val launchTime = format.parse("2017-12-21T03:15:31.106GMT").getTime
val runTime = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTimeInMillis - 
              launchTime

Но я получаю отрицательное число. Неправильный ли формат времени? Или что?

1 ответ

TL; DR

    String launchTimeString = "2017-12-21T03:15:31.106GMT";
    launchTimeString = launchTimeString.replaceFirst("GMT$", "Z");
    long launchTime = Instant.parse(launchTimeString).toEpochMilli();
    long runTime = System.currentTimeMillis() - launchTime;

(Извините, я могу написать только код Java 8, мне придется доверить вам перевод.)

java.time и ISO 8601

Классы даты и времени из Java 1.0 и 1.1 давно устарели, и SimpleDateFormat в частности, как известно, хлопотно. Я рекомендую вам прекратить их использование и использовать java.timeсовременный API даты и времени Java. С ним намного приятнее работать.

Ваша строка времени запуска немного смешная. Он напоминает стандартный формат ISO 8601 с характеристикой T между датой и временем, но имеет нестандартный GMT в конце концов, где строки, соответствующие стандарту, обычно имеют Z (или положительное или отрицательное смещение от UTC). Так как современные классы даты и времени анализируют ISO 8601 как их значение по умолчанию, то есть без какого-либо явного средства форматирования, и поскольку написание строк шаблонов формата кажется бесконечным источником ошибок (это, конечно, не только вы), я нашел это заманчивым изменить вашу строку, чтобы соответствовать стандарту, а затем проанализировать его.

Что было не так в вашем шаблоне формата?

В шаблонной строке есть две ошибки:

  • Вы хотите в верхнем регистре HH на час дня. Строчные hh в течение часа в течение AM или PM, в интервале от 1 до 12. С SimpleDateFormat эта ошибка обычно "просто" означает, что час 12 понимается как 00 (что дало бы вам очень долгое время выполнения) (современный DateTimeFormatter более охотно говорит вам, что у вас есть ошибка, если вы попробуете то же самое с этим классом).
  • В то время как строчные ss верно для секунд, миллисекунды в верхнем регистре SSS, Это должно быть именно то, что вас поразило: 106 в вашей строке считалось секундами, а не миллисекундами, поэтому, если вы запустили свой код до 03:16:46, вы получили отрицательное время выполнения.

Таким образом, обе ошибки сводятся к следующему: Форматирование строк шаблона чувствительно к регистру, поэтому вам нужно остерегаться правильного регистра.

связи

Другие вопросы по тегам