Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 日期计算-进度条显示时间限制_Java_Date - Fatal编程技术网

Java 日期计算-进度条显示时间限制

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("

我想制作一个简单的progressbar,显示某个过程需要多少时间。在创建它的时候,我只有实际的百分比(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;

它根本不起作用。总持续时间甚至有些奇怪…

问题似乎是您还有剩余时间
字符串
,您希望将其解析为完成工作的百分比

显然,你需要的第一件事是总的预期时间。假设这也是一个
字符串

首先编写一个方法,将
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%完成。至于其余的,我当时不明白这个问题;请编辑您的问题以使其更清楚。