web-dev-qa-db-ja.com

Java 8

だから私はJava 8と新しい時間APiを使用するのに十分幸運ですが、丸め関数は表示されません...

基本的には時間が...

2014-08-28T10:01.00.000 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.10.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.25.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.49.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.59.999 ----> 2014-08-28T10:02.00.000

これは大丈夫そうですが、正しいですか?

LocalDateTime now =  LocalDateTime.now(Clock.systemUTC());
LocalDateTime newTime =  now.plusMinutes(1);

System.out.println(newTime.toString());
System.out.println(newTime.format(DateTimeFormatter.ofPattern("yyyy-dd-MM'T'HH:mm:00.000")));
32
user432024

Java.time AP​​Iは天井への丸めをサポートしていませんが、 床への丸め (切り捨て)をサポートしています。

LocalDateTime now =  LocalDateTime.now();
LocalDateTime roundFloor =  now.truncatedTo(ChronoUnit.MINUTES);
LocalDateTime roundCeiling =  now.truncatedTo(ChronoUnit.MINUTES).plusMinutes(1);

さらに、1分に1回だけ刻むクロックを取得する機能があります。

Clock minuteTickingClock = Clock.tickMinutes(ZoneId.systemDefault());
LocalDateTime now =  LocalDateTime.now(minuteTickingClock);
LocalDateTime roundCeiling =  now.plusMinutes(1);

このクロックは、分単位で自動的に切り捨てられます(ただし、遅延キャッシュされた値を返すことができるように 指定 です)。必要に応じて、Clockを静的変数に格納できることに注意してください。

最後に、これが複数の場所で使用する一般的な操作である場合、ライブラリ TemporalAdjuster 関数を記述して丸めを実行することができます。 (調整器は、一度作成してテストし、静的変数またはメソッドとして利用可能にすることができます)。

51
JodaStephen
LocalDateTime newTime = now.plusMinutes(1).minusNanos(1).withSecond(0).withNano(0);

これは最も近い分に切り上げられ、整数部分として分を含む天井関数として機能します。

2
Sean Van Gorder

Java.time(Java 8)の新しい時間APIには、他のライブラリと同様に丸め機能なしがあります。文字列レベルで丸めるためにフォーマットを使用しようとします。ただし、時間オブジェクトを丸めたい場合は、この丸めを手動で行うことができます。

LocalDateTime now =  LocalDateTime.now(Clock.systemUTC());
LocalDateTime newTime =  now.plusMinutes(1).withSecond(0).withNano(0);

ちなみに、あなたは確かに天井ではなく床を意味していませんか?

更新:

私は床に設定するためのこの少し良い方法を見つけました(明らかに唯一の丸め機能、天井はサポートされていません):

LocalDateTime now =  LocalDateTime.now(Clock.systemUTC());
LocalDateTime newTime =  now.plusMinutes(1).truncatedTo(ChronoUnit.MINUTES);
1
Meno Hochschild