5

時間番号を渡したいのですが、TimeUnitそれは入っています。

long number = some number;
TimeUnit timeUnit = some arbitrary time unit

ObjectJava ライブラリからtime と timeUnit の両方を保持できるものは何ですか?

4

3 に答える 3

8

数値と任意の をカプセル化する Java ライブラリ オブジェクトはありませんTimeUnit。ただし、Java 8 には、必要な時間単位に変換するものがあります。

java.time.Duration

期間は、提供された数量を格納し、他のすべての時間単位との比較と変換を提供します。例えば:

// Create duration from nano time
Duration systemTime = Duration.ofNanos(System.nanoTime());

// Create duration from millis time
Duration systemTime = Duration.ofMillis(System.currentTimeMillis());

もちろん、足し算、引き算、またはその他の数学演算を行う場合、精度は現在の演算と指定された の精度と同程度になりDurationます。

/**
* Example that tells if something has reached the required age
* TRUE IF THE current system time is older or equal to the required system time
*/
    // TRUE IF THE FILE HAS NOT WAITED ENOUGH TIME AFTER LAST CREATE/MODIFY
    private boolean isMature() {
        // it is not known whether required age is nanos or millis
        Duration requiredAge = systemTimeWhenMature();
        // so create a duration in whatever time unit you have
        // more precise = possibly better here
        Duration actualAge = Duration.ofNanos(System.nanoTime());
       // if ON or OLDER THAN REQUIRED AGE
       // actualAge - requiredAge  = balance
       // 20 - 21 = -1 (NOT MATURE)
       // 21 - 21 =  0 (OK)
       // 22 - 21 =  1 (OK)
       Duration balance = actualAge.minus(requiredAge);
       if (balance.isNegative()) {
           logger.info("Something not yet expired. Expires in {} millis.", balance.negated());
           return false;
       } else {
           return true;
       }
    }

また、Duration には、格納された量をさまざまな単位で変換および処理するのに役立つメソッドが他にもたくさんあります。

精度が計算に与える影響を理解することが重要です。これは、例によって一般的な精度の契約を示しています。

    // PICK A NUMBER THAT IS NOT THE SAME WHEN CONVERTED TO A LESSER PRECISION
    long timeNanos = 1234567891011121314L;
    long timeMillis = TimeUnit.MILLISECONDS.convert(timeNanos, TimeUnit.NANOSECONDS);

    // create from milliseconds
    Duration millisAccurate = Duration.ofMillis(timeMillis);
    Duration nanosAccurate = Duration.ofNanos(timeNanos);

    // false because of precision difference
    assertFalse(timeMillis == timeNanos);
    assertFalse(millisAccurate.equals(nanosAccurate));

    // true because same logical precision conversion takes place
    assertTrue(timeMillis - timeNanos <= 0);
    assertTrue(millisAccurate.minus(nanosAccurate).isNegative());

    // timeNanos has greater precision and therefore is > timeMillie
    assertTrue(timeNanos - timeMillis > 0);
    assertTrue(nanosAccurate.minus(millisAccurate).negated().isNegative());

一言で言えば..見つけるのにこんなに時間がかかったなんて信じられないDuration!:)

于 2013-12-08T02:54:49.527 に答える
1

TimeUnit は、Second、Milliseconds などの時間単位タイプを保持する列挙型です。

TimeUnit は時間を保持するためのものではありませんが、TimeUnit API を使用して単位の時間を別の単位に変換できます。

時間とその単位を保持するオブジェクトを作成する必要があると思います。

Java 8 を使用している場合。新しい Date API を使用できます。

http://download.java.net/jdk8/docs/api/java/time/package-summary.html

于 2013-12-08T00:05:18.373 に答える
1

Joda-Time にはIntervalがありますが、JRE の包括的なオブジェクト タイプのみを使用する場合は、Java Bean を作成する必要があります (おそらく Interval と呼びます)。

于 2013-12-08T00:07:08.503 に答える