tl; dr
古くなったjava.util.Date
オブジェクトを代わりのオブジェクトに変換しますjava.time.Instant
。次に、経過時間をとして計算しDuration
ます。
Duration d =
Duration.between( // Calculate the span of time between two moments as a number of hours, minutes, and seconds.
myJavaUtilDate.toInstant() , // Convert legacy class to modern class by calling new method added to the old class.
Instant.now() // Capture the current moment in UTC. About two and a half hours later in this example.
)
;
d.toString():PT2H34M56S
d.toMinutes():154
d.toMinutesPart():34
ISO 8601形式: PnYnMnDTnHnMnS
賢明な標準ISO 8601は、時間のスパンの簡潔なテキスト表現を、年、月、日、時間などの数として定義します。標準では、そのようなスパンを持続時間と呼びます。形式はPnYnMnDTnHnMnS
、P
「期間」を意味T
し、日付部分と時間部分を分離し、その間に数字の後に文字が続きます。
例:
P3Y6M4DT12H30M5S
3年、6か月、4日、12時間、30分、5秒
PT4H30M
4時間半
java.time
java.timeのフレームワークは、Java 8に組み込まれており、後で面倒な古い取って代わるjava.util.Date
/ java.util.Calendar
クラスを。新しいクラスは非常に成功したJoda-Timeフレームワークに触発されたもので、後継として意図されており、概念は似ていますが再構築されています。JSR 310で定義されています。ThreeTen-Extraプロジェクトによって拡張されました。チュートリアルを見る。
瞬間
このInstant
クラスは、ナノ秒の分解能(小数点以下9桁まで)でUTCのタイムライン上の瞬間を表します。
Instant instant = Instant.now() ; // Capture current moment in UTC.
Date
/ などのレガシークラスを避けるのが最善Calendar
です。ただし、java.timeにまだ更新されていない古いコードと相互運用する必要がある場合は、前後に変換してください。古いクラスに追加された新しい変換メソッドを呼び出します。a java.util.Date
からに移動するにはInstant
、を呼び出しますDate::toInstant
。
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
一定の期間
java.timeクラスは、時間のスパンを年、月、日、時間、分、秒の数として表すというこの考えを2つの半分に分割しました。
ここに例があります。
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
コンソールにダンプします。
との両方ともPeriod
、それらの値の文字列表現を生成するためにISO 8601標準をDuration
使用します。
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
現在:2015-11-26T00:46:48.016-05:00 [アメリカ/モントリオール]未来:2015-11-26T00:46:48.016-05:00 [アメリカ/モントリオール] = PT1H3M
Java 9にはDuration
、日、時間、分、秒の部分を取得するためのメソッドが追加されています。
期間全体の合計日数、時間数、分数、秒数、ミリ秒数、ナノ秒数を取得できます。
long totalHours = duration.toHours();
Java 9では、Duration
クラスは、日、時間、分、秒、ミリ秒/ナノ秒のさまざまな部分を返すための新しいメソッドを取得します。呼び出しto…Part
方法を:toDaysPart()
、toHoursPart()
、とになります。
ChronoUnit
「経過日数」など、より単純で大きな時間単位のみを気にする場合は、ChronoUnit
列挙型を使用します。
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
もう一つの例。
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
java.timeについて
java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスjava.util.Date
、Calendar
&を、SimpleDateFormat
。
ジョダタイム今ではプロジェクト、メンテナンスモード、java.timeへの移行をアドバイスします。
詳細については、Oracleチュートリアルを参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310ですです。
java.timeクラスはどこで入手できますか?
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。
ジョーダタイム
更新:Joda -Timeプロジェクトがメンテナンスモードになり、チームはjava.timeクラスへの移行をアドバイスします。私はこのセクションを歴史のためにそのままにしておきます。
Joda-Timeライブラリーは、デフォルトとしてISO 8601を使用します。そのPeriod
クラスは、これらのPnYnMnDTnHnMnS文字列を解析して生成します。
DateTime now = DateTime.now(); // Caveat: Ignoring the important issue of time zones.
Period period = new Period( now, now.plusHours( 4 ).plusMinutes( 30));
System.out.println( "period: " + period );
レンダリング:
period: PT4H30M