Java 日期计算-进度条显示时间限制
我想制作一个简单的progressbar,显示某个过程需要多少时间。在创建它的时候,我只有实际的百分比(int)和剩余的时间(字符串格式HH:mm:ss)。我希望它每秒钟更新一次,并向我显示进程的实际状态。我什么都试过了,但都没用。当前版本看起来像这样-请告诉我我做错了什么Java 日期计算-进度条显示时间限制,java,date,Java,Date,我想制作一个简单的progressbar,显示某个过程需要多少时间。在创建它的时候,我只有实际的百分比(int)和剩余的时间(字符串格式HH:mm:ss)。我希望它每秒钟更新一次,并向我显示进程的实际状态。我什么都试过了,但都没用。当前版本看起来像这样-请告诉我我做错了什么 int initialProgress = 35; // % // time to finish process Date endDate = new SimpleDateFormat("HH:mm:ss").parse("
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;
它根本不起作用。总持续时间甚至有些奇怪…问题似乎是您还有剩余时间
字符串
,您希望将其解析为完成工作的百分比
显然,你需要的第一件事是总的预期时间。假设这也是一个字符串
首先编写一个方法,将HH:mm:ss
字符串
解析为表示剩余时间(以秒为单位)的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
这些是数字一样,它将自动转换(或尝试转换,因此出现异常)为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
。现在,我们只需要存储它,并根据任何新的持续时间字符串计算百分比。这应该可以做到:
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
二十五
看起来不错,这是剩余时间占总时间的百分比。也许是我们想要的进度条。让我们倒过来:
public static int asPercentage(final long totalTime, final long remaining) {
final double percentage = remaining / ((double) totalTime);
return 100 - (int) (percentage * 100);
}
输出:
25
50
七十五
啊哈。更好。请定义“它根本不起作用”。请告诉我们详细信息,以及有助于我们理解您的问题的任何信息。您正在将持续时间(字符串)解析为日期。这显然是错误的。“SimpleDataFormatter”是否还有使用此名称的类。@MasudCSECUET我想他指的是SimpleDataFormatter
:)抱歉,我想说它不起作用,我想说它计算进度,但它与实际值没有任何共同之处。我得到100%,但实际上有75%。当然,这是简化的代码。我不解析字符串,而是一个包含字符串的变量。你没有仔细阅读我的帖子。我写道,我只剩下时间和当前百分比。如果我可以简单地使用SimpleDataFormat.parse,那么我需要自己的转换器做什么呢。整个问题在于计算总持续时间。您需要自己的格式化程序,因为剩余时间是一个持续时间,而不是一个时间。所以把“07:07:07”解析成一个时间对你没有帮助;您需要将其解析为秒数。这就是为什么你会得到奇怪的结果;i、 e.将剩余时间解析为一个时间,并检查是否比现在晚-因此在8:00时,您的任务将始终100%完成。至于其余的,我当时不明白这个问题;请编辑您的问题以使其更清楚。