-1

我想制作一个简单的进度条,向我展示某个过程需要多少时间。在创建它的那一刻,我只有实际百分比(作为 int)和剩余时间(作为字符串格式的 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;

它根本行不通。总持续时间甚至有点奇怪......

4

1 回答 1

1

问题似乎是您还有时间String,并且您想将其解析为已完成工作的百分比。

显然,您需要的第一件事是总预期时间。让我们假设这也是一个String.

首先编写一个方法来解析你HH:mm:ss Stringlong剩余时间(以秒为单位)。

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解析为. 正如我们所说,这些是数字,它会自动转换(或尝试转换,因此例外)为.StringObjectMessageFormatLong

一旦我们有了这些数字,我们就会使用(非常有用的)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

啊哈。好多了。

于 2013-06-22T16:20:18.940 回答