日期计算 - 显示timeleft的进度条

时间:2013-06-22 15:54:35

标签: java date

我想制作一个简单的进度条,向我展示一些进程需要多长时间。在创建它的那一刻,我只有实际的百分比(作为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;

它根本不起作用。总持续时间甚至是奇怪的......

1 个答案:

答案 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

阿公顷。好多了。