Java8 Date and Time API の時点と時間量

f:id:Naotsugu:20130915005711j:plain

Instant

Instant は時系列上のある一時点を表現します。

Instant の内部では、以下のように seconds と nanos というフィールドで、ある時点からの経過時間をナノ秒の単位で保持します。

public final class Instant implements Temporal, 
        TemporalAdjuster, Comparable<Instant>, Serializable {

  ・・・
  private final long seconds;
  private final int nanos;
  ・・・
}

ある時点は、もちろんエポック(グリニッジ子午線上の1970年1月1日 午前0時)となります。

エポックは Instant の static フィールドで以下のように定義されています。

public static final Instant EPOCH = new Instant(0, 0);

第一引数が秒、第二引数がナノ秒となります。

エポックより前はマイナス値で表現されます。 Instant.MIN は10億年前、Instant.MAX は1,000,000,000年12月31日となります。

Instant は以下のようなファクトリでインスタンスの作成ができます。

Instant.now()
Instant.ofEpochSecond(long epochSecond)
Instant.ofEpochSecond(long epochSecond, long nanoAdjustment)
Instant.ofEpochMilli(long epochMilli)

また以下のように、ISO形式の文字列や、他の日付や時間を表すものからインスタンスを得ることもできます。

Instant.parse(final CharSequence text) // ISO形式 2011-12-03T10:15:30Z
Instant.from(TemporalAccessor temporal)

Duration

Duration は 34.5秒 のような時間の量を表現します。

Instant と同じように以下のフィールドで時間量を保持します。

private final long seconds;
private final int nanos;

Instant と Duration は共に、時間量に対して plusminus といった演算が可能です。

期間(量)を表す Duration には dividedBymultipliedBy といった演算が可能ですが、ある時点を表す Instant にはこのような演算は用意されていません。

以下のようなファクトリでインスタンスの作成ができます。

Duration.ofDays(long days)
Duration.ofHours(long hours)
Duration.ofMinutes(long minutes)
Duration.ofSeconds(long seconds)

ほかの時間量や時点などからは以下のようなファクトリでインスタンスを作成することもできます。

Duration.from(TemporalAmount amount)
Duration.between(Temporal startInclusive, Temporal endExclusive)

Instant と Duration を使うことで、System.currentTimeMillis() などで行っていた経過時間の記録を以下のように代用することができます。

Instant start = Instant.now();
someMethd();
Instant end = Instant.now();
Duration.between(start, end).toMillis();

Period

Duration が ナノ秒単位での時間量を表したのに対して、Period は日付ベースの時間の量を表します。

日付ベースの時間量は、Period の以下のフィールドで保持されます。

  private final int years;
  private final int months;
  private final int days;

インスタンスは以下のファクトリメソッドで取得することができます。

Period of(10, 3, 1)

10年3ヶ月と1日を表す時間量が得られます。これらの値には負数を指定することも可能です。

また、以下のように年月日および週(2を指定した場合は14日のように扱われる)を単独で指定することもできます。

Period.ofYears(int years)
Period.ofMonths(int months)
Period.ofWeeks(int weeks)
Period.ofDays(int days)

ほかの時間量や時点などからは以下のようなファクトリでインスタンスを作成することもできます。

Period.from(TemporalAmount amount)
Period.between(LocalDate startDateInclusive, LocalDate endDateExclusive)





etc9.hatenablog.com こちらにも書きましたが、少し細かく書いてみました。