3

我正在尝试使用线程创建计时机制,但在获取两个日期之间的时间差以及使用该差来获取当前剩余时间百分比时遇到了问题。这是我试图原型化的概念:

http://i.stack.imgur.com/wrsrF.png

这是我的实现:

long startMilisecs = System.currentTimeMillis();
long currentMilisecs;
long endDateMilisecs = getEndDate().getTime();
int diffMillisecs = ((int)(endDateMilisecs - startMilisecs) / 1000) / 60;
int currPerc; 
while (startMilisecs <= endDateMilisecs) 
{
    currentMilisecs = (int) System.currentTimeMillis();
    currPerc = ((int)currentMilisecs * 100) / diffMillisecs;
    System.out.println(" Current Percentage: " + currPerc);
}

这段代码的问题是百分比不是从 0 开始,而是从 20% 到 40%。

你能告诉我这有什么问题吗?对于这个问题,我仅限于使用线程。

4

3 回答 3

7

检查以下:

 public static int getPercentageLeft(Date start, Date end) {
        long now = System.currentTimeMillis();
        long s = start.getTime();
        long e = end.getTime();
        if (s >= e || now >= e) {
            return 0;
        }
        if (now <= s) {
            return 100;
        }
        return (int) ((e - now) * 100 / (e - s));
    }
于 2013-04-08T14:01:29.920 回答
1

你需要像这样减去开始时间

currPerc = ((currentMilisecs - startMilisecs) * 100) / diffMillisecs;

得到正确的百分比。

于 2013-04-08T13:55:37.730 回答
0

问题出在 System.currentTimeMillis();. 取自 javadoc:

公共静态长 currentTimeMillis()

以毫秒为单位返回当前时间。请注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,并且可能更大。例如,许多操作系统以几十毫秒为单位测量时间。

有关“计算机时间”和协调世界时 (UTC) 之间可能出现的细微差异的讨论,请参阅类 Date 的描述。

返回: 当前时间与 UTC 1970 年 1 月 1 日午夜之间的差异,以毫秒为单位。

因此,您当前的时间(以毫秒为单位)基于 1970 年 1 月 1 日 UTC,而不是您的开始日期。

您需要通过从 给出的值中减去开始时间来计算当前时间System.currentTimeMillis();

我基本上在这里制定您的链接图像。也可以进行其他替代计算。

于 2013-04-08T13:58:39.523 回答