Как получить время выполнения активной задачи в соответствии с ее 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, вы получили отрицательное время выполнения.
Таким образом, обе ошибки сводятся к следующему: Форматирование строк шаблона чувствительно к регистру, поэтому вам нужно остерегаться правильного регистра.
связи
- Учебник Oracle: Дата и время, объясняя, как использовать
java.time
, - Статья в Википедии по ISO 8601.