2013-06-22 152 views
-1

我想做一個簡單的進度條,告訴我一些過程需要多少時間。在創建它時,我只有實際的百分比(如int)和剩下的時間(以String格式HH:mm:ss)。我希望它每秒更新一次並向我展示進程的實際狀態。我已經嘗試了一切,它不起作用。目前的版本是這樣的 - 告訴我,我在做什麼請錯...日期計算 - 進度條顯示timeleft

int initialProgress = 35; // % 
// time to finish process 
Date endDate = new SimpleDateFormat("HH:mm:ss").parse("07:07:07"); 
Date now = new Date(); 
long totalDuration = (long) (((double)(endDate.getTimeInMillis() 
       - now.getTimeInMillis()) * 100.0/(double)initialProgress); 

,然後每一秒我再說一遍:

now = new Date(); 
int currentProgress = (totalDuration - endDate.getTimeInMillis() 
       + now.getTimeInMillis())/totalDuration; 

它根本不工作。總持續時間甚至是奇怪的...

+2

請定義「它根本不起作用」。告訴我們細節,任何有助於我們理解你的問題的東西。 –

+2

您正在將一個持續時間(字符串)解析爲日期。這顯然是錯誤的。 –

+1

'SimpleDataFormatter'是否有任何類保留這個名字。 – Masudul

回答

1

這個問題似乎是,你有剩餘時間String,你想解析它的工作完成百分比。

顯然,您需要的第一件事是預計總時間。讓我們假設這也是String

首先編寫一個方法來解析您的HH:mm:ssStringlong表示剩餘秒數。

public long parseToSeconds(final String duration) throws ParseException { 
    final MessageFormat durationFormat = new MessageFormat("{0,number,#}:{1,number,#}:{2,number,#}"); 
    final Object[] parsedTimeRemaining = durationFormat.parse(duration); 
    final long totalDuration = TimeUnit.HOURS.toSeconds((Long) parsedTimeRemaining[0]) 
      + TimeUnit.MINUTES.toSeconds((Long) parsedTimeRemaining[1]) 
      + (Long) parsedTimeRemaining[2]; 
    return totalDuration; 
} 

我們在這裏做的是使用MessageFormatString解析成的Object數組。正如我們告訴MessageFormat這些是數字,它會自動轉換(或嘗試轉換,因此例外)到Long

一旦我們有這些數字,我們使用(非常有用)TimeUnit類將它們全部縮放到秒。

一對夫婦的快速測試,以確保我們在正確的軌道上:

System.out.println(parseToSeconds("00:00:01")); 
System.out.println(parseToSeconds("00:01:00")); 
System.out.println(parseToSeconds("01:00:00")); 
System.out.println(parseToSeconds("01:01:01")); 

輸出:

看起來不錯。

爲了簡單起見,我們假設正確的過程開始時間爲了簡單起見「04:04:04」,這給出了14644。現在我們只需要存儲它並根據任何新的持續時間String計算百分比。這應該做的伎倆:

public int asPercentage(final long totalTime, final long remaining) { 
    final double percentage = remaining/((double) totalTime); 
    return (int) (percentage * 100); 
} 

注意的事實,我投(貌似毫無意義)的資料轉移到double之一。這是因爲在Java中,對整型的任何操作總是返回另一個整型。鑄造到double強制它返回double

讓我們再次做一個快速檢查:

final long totalDuration = 14644; 
System.out.println(asPercentage(totalDuration, parseToSeconds("03:03:03"))); 
System.out.println(asPercentage(totalDuration, parseToSeconds("02:02:02"))); 
System.out.println(asPercentage(totalDuration, parseToSeconds("01:01:01"))); 

輸出:

看起來不錯,就是剩餘時間的百分比總數。也許到了我們想要的進度條。讓倒轉:

public static int asPercentage(final long totalTime, final long remaining) { 
    final double percentage = remaining/((double) totalTime); 
    return 100 - (int) (percentage * 100); 
} 

輸出:

阿公頃。好多了。

+0

您沒有仔細閱讀我的文章。我寫了我只剩下剩餘時間和當前比例。如果我可以簡單地使用SimpleDateFormat.parse,那麼我還需要自己的轉換器。整個問題都在計算總持續時間。 – karex

+0

您需要自己的格式化程序,因爲剩餘時間是持續時間,而不是時間。所以解析「07:07:07」到一段時間並不會幫助你;你需要解析它到幾秒鐘。這就是爲什麼你會得到奇怪的結果;即你解析剩下的時間,並檢查它是否比現在晚 - 所以在8:00你的任務將完成100%。至於其他問題,我不明白這個問題。請編輯你的問題更清楚。 –