3

スレッドを使用してタイミングメカニズムを作成しようとしています.2つの日付の時間差を取得し、その差を使用して現在の残り時間の割合を取得するのに問題があります。プロトタイプを作成しようとしているコンセプトは次のとおりです。

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 から取得:

public static long currentTimeMillis()

現在の時刻をミリ秒で返します。戻り値の時間単位はミリ秒ですが、値の粒度は基盤となるオペレーティング システムに依存し、それよりも大きい場合があることに注意してください。たとえば、多くのオペレーティング システムでは、時間を数十ミリ秒単位で測定します。

「コンピューター時間」と協定世界時 (UTC) の間に発生する可能性のあるわずかな不一致については、クラス Date の説明を参照してください。

戻り値: 現在時刻と UTC 1970 年 1 月 1 日午前 0 時との差 (ミリ秒単位)。

したがって、ミリ秒単位の現在の時間は、開始日ではなく、1970 年 1 月 1 日 UTC に基づいています。

で与えられる値から開始時間を引いて、現在の時間を計算する必要がありますSystem.currentTimeMillis();

私は基本的にここでリンクされた画像を作成しています。他の代替計算も実行できます。

于 2013-04-08T13:58:39.523 に答える