java se / java eeに任意の「時間解決」を表す組み込みクラスはありますか?たとえば、1時間ごと、1秒ごと、10分ごとなど。
4 に答える
java.util.concurrent.TimeUnit列挙型を見てください。ここからユニットを使用できます。
車輪の再発明をしないでください。
より複雑な時間操作については、Joda時間ライブラリをお勧めします。
あなたはいつでも時間の解像度を下げることができます例えば
long millis = System.currentTimeMillis();
long seconds = millis / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
したがって、30分ごとに使用したい場合は、
long halfHour = System.currentTimeMillis() / (30 * 60 * 1000L)
粒度単位
時間対分対秒など、特定の粒度の時間を単に示す方法を意味する場合、Kremserによって受け入れられた回答は正しいです。TimeUnit
列挙型はまさにこれです。ただし、Javaに組み込まれている別の選択肢もあります。
ChronoUnit
Java 8以降には、の値のリストが類似していますがjava.time.temporal.ChronoUnit
、7の値のリストが長いことに注意してTimeUnit
ください。
- 永遠に
- ERAS
- ミレニアム
- 世紀
- 数十年
- 年
- 月
- 週
- 日々
- HALF_DAYS
- 時間
- 分
- 秒
- ミリス
- MICROS
- ナノス
両方の列挙型、TimeUnit
&ChronoUnit
、は便利です。単位間の変換はTimeUnit
、さまざまな方法で提供されます。そのメソッドChronoUnit
で経過時間を計算します。between
時計の増分
時計を特定の増分で刻々と変化させたい場合、Clock
クラスは代替の実装を提供します。
Clock.tickSeconds
–現在の時間は秒単位で増加します。Clock.tickMinutes
–現在の時間は分単位で増加します。Clock.tick
–指定した量の現在の時間増分
Clock
デフォルトのクロックの代わりに使用するために、多くのjava.timeクラスでオプションの引数として代替実装オブジェクトを渡します。
値を切り捨てる
日時の値があり、それを切り捨てて小さいフィールドをゼロにドロップする場合は、を確認してtruncatedTo
ください。TemporalUnit
で見つかった実装を使用して、インターフェイスで粒度を指定しますChronoUnit
。
たとえば、現在の瞬間を取得し、秒の小数部と秒を削除して、分単位の値を取得します。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime nowWholeMinutes = now.truncatedTo( ChronoUnit.MINUTES );
整数除算を使用します。その単純な例は次のとおりです。
long millis = System.currentTimeMillis();
現在の時刻がミリ秒単位で表示されます。値がミリ秒ごとresolution
(たとえば、1000ミリ秒ごと)だけ変化する時間を必要とする場合は、整数除算を使用できます。
long resolution = 1000;
long result = millis / resolution * resolution
ミリ秒を結果で割ると、この例では秒になります。とは両方とも整数変数/
であるため、整数除算を行います。それはと同じになります。ここでを掛けると、新しい解像度の単位に達した場合にのみ結果が変わります。millis
resolution
Math.floor(((float)millis) / ((float) resolution)))
resolution
例:新しい5 Minutesブロックに到達した場合にのみ時刻が変更される時計が必要であると仮定すると、ブロックはたとえば0〜4分、5〜9分、10〜15分などになります。5分は1000ミリ秒です。 /秒*60秒/分*5分=300000ミリ秒。したがって、を設定するとresolution = 300000
、result
5分ブロックごとに1回だけ変更されます。ミリス=0-299999の場合、結果=0。ミリス=300000-599999、結果=5などの場合。あなたは私が推測する考えを得る。