我想制作一个简单的进度条,向我展示一些进程需要多长时间。在创建它的那一刻,我只有实际的百分比(作为int)和剩下的时间(如String格式化HH:mm:ss)。我希望它每秒更新一次,并向我展示实际的过程状态。我已经尝试了一切,但它不起作用。当前版本看起来像这样 - 请告诉我,我做错了什么......
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;
它根本不起作用。总持续时间甚至是奇怪的......
答案 0 :(得分:1)
问题似乎是您有剩余时间String
,并且您希望将其解析为已完成工作的百分比。
显然,您需要的第一件事是预计总时间。让我们假设这也是String
。
首先编写一种方法,将HH:mm:ss
String
解析为代表剩余时间的long
。
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;
}
我们在此处执行的操作是使用MessageFormat
将您的String
解析为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"));
输出:
1
60个
3600
3661
看起来不错。
让我们假设作为流程的开始,我们得到剩余的时间,为简单起见,“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")));
输出:
75
50个
25
看起来很好,这是剩余时间占总数的百分比。也许是我们想要的进度条。让我们反过来:
public static int asPercentage(final long totalTime, final long remaining) {
final double percentage = remaining / ((double) totalTime);
return 100 - (int) (percentage * 100);
}
输出:
25
50个
75
阿公顷。好多了。