2014-02-21 3 views
1

Я пытаюсь из Отлич- продолжительности времени без имен полей по умолчанию, то есть дни, часы, минуты, секунды и т.д.Groovy: TimeDuration - Пользовательский формат вывода

Эта разница отформатирован время кладется в конце индикатора выполнения, поэтому отображается время выполнения в реальном времени процесса.

public static String calculateTime(Date timeStart) 
{ 
     Date timeStop = new Date() 
     TimeDuration duration = TimeCategory.minus(timeStop, timeStart) 
     return "${duration.days}:${duration.hours}:${duration.minutes}:${duration.seconds}".toString() 
     //return duration.toString() 
} 


public static void printProgBar(long num, long den, Date startDate){ 
    def bar = "["; 
     DecimalFormat df = new DecimalFormat("#.00"); 
     def dataType = ""; 

     def len = den.toString().length() 

     if(den == 0) 
     { 
       den = 1; 
     } 

     BigDecimal percent = ((num/den)*100) 

     if(len <= 3){ dataType = "bytes" } 
     if(len <= 6 && len > 3){ dataType = "Kbs" } 
     if(len <= 9 && len > 6){ dataType = "Mbs" } 
     if(len <= 12 && len > 9){ dataType = "Gbs" } 

     def n = num 
     def d = den 
     if(dataType.equals("Kbs")) 
     { 
      n = num/1024 
      d = den/1024 
     } 
     if(dataType.equals("Mbs")) 
     { 
      n = num/1024/1024 
      d = den/1024/1024 
     } 
     if(dataType.equals("Gbs")) 
     { 
      n = num/1024/1024/1024 
      d = den/1024/1024/1024 
     } 

    for(int i = 0; i < 50; i++){ 
     if(i < (percent/2)){ 
      bar += "|"; 
     }else if(i == (percent/2)){ 
      bar += ">"; 
     }else{ 
      bar += " "; 
     } 
    } 

    def message = (percent == 100) ? "Complete!" : "processed..." 

    bar += "] " + df.format(percent) + "% " + df.format(n) + " of " + df.format(d) + " $dataType $message " + HSTools.calculateTime(startDate); 
    print "\r" + bar; 
} 

Выход:

Загрузка данных для: Patient_Contacts_Data.txt Создание сканера и настройка ограничителя: \ |^@ *^@ г^@ *^@ \ | [|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||] 100.00% 1.60 от 1.60 Мбс Завершить! 0: 0: 0: 5656 обработанных записей: 5857 Прошедшее время: 0: 0: 0: 56

По большей части мой код, как представляется, будет работать, однако время от времени появляются секунды удвоить на себя.

Любые мысли о том, что может быть причиной этого? Или предложения о том, как лучше форматировать этот TimeDuration?

+0

Что такое HSTools? Вывод отформатирован в 'HSTools.calculateTime (startDate)', что, вероятно, должно начаться. – Steinar

+0

HSTools.calculateTime() - первая функция, указанная в коде выше. Вы можете видеть, что набор форматирования - $ {duration.days}: $ {duration.hours}: $ {duration.minutes}: $ {duration.seconds} , который должен выдавать результат 0: 0: 0: 0 (дни, часы, минуты, секунды) – Asmodeius

ответ

0

Проблема с вашим кодом в том, что предыдущий вывод не удаляется. Поскольку ваш вывод не отформатирован до фиксированного размера, более короткий вывод, который появляется позже, не будет перезаписывать последние символы из предыдущего вывода.

Например, если продолжительность идет от 59 секунд до 1 минуты, она меняется от чего-то вроде этого:

[|||||||||||||||||   ] 59.10% .58 of .98 Kbs processed... 0:0:0:59 

к чему-то вроде этого:

[|||||||||||||||||   ] 59.20% .58 of .98 Kbs processed... 0:0:1:0 

Но поскольку первая строка длиннее чем второй, фактический результат будет выглядеть так:

[|||||||||||||||||   ] 59.20% .58 of .98 Kbs processed... 0:0:1:09 

Вы можете решить i t с добавлением некоторого пробела или путем создания выходного времени фиксированного размера (например, всегда используйте 2 цифры в секундах, минутах, часах и т. д.).

Примечание: при запуске из IntelliJ IDEA оставшаяся часть линии была фактически удалена, но при запуске из оболочки ее не было.

Смежные вопросы