问题似乎是您还有时间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;
}
我们在这里所做的是使用 a将您的数组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
. 现在我们只需要存储它并根据任何新的 duration 计算百分比String
。这应该可以解决问题:
public int asPercentage(final long totalTime, final long remaining) {
final double percentage = remaining / ((double) totalTime);
return (int) (percentage * 100);
}
请注意,我将其中一个项目(看似毫无意义)转换为double
. 这是因为在 Java 中,对整数类型的任何操作总是返回另一个整数类型。强制转换为 adouble
强制它返回 a 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
啊哈。好多了。