java 8 Gold 日付/時刻API②

【資格】java8-Oracle Gold

おはようございます。

令和2年も残り1ヶ月ちょいですが、早めに資格を取れるように知識を定着させましょう〜

前回に引き続き、

java 8 gold資格試験の出題範囲から日付・時刻APIについて解説します。

はじめに



【対象者】本記事は、Oracle Certified Java Programmer, Gold SE 8 認定資格試験の出題分野の解説をいたします。特に以下のような方には読んでいただければ幸いです。

  • 当該試験を受ける方
  • java 11 Goldの試験を受ける方で日付/時刻APIの理解を深めたい方
  • 受験の有無にかかわらず、javaの日付/時刻APIをおさらいしたい方
  • 普通にド忘れしたプログラマーの方

出題範囲の確認

公式ページの出題内容は以下の通りです。相変わらず難解ですね。。。

  • LocalDate、LocalTime、LocalDateTime、Instant、Period および Duration を使用して日付と時刻を単一オブジェクトに結合するなど、日付に基づくイベントと時刻に基づくイベントを作成および管理する
  • 複数のタイムゾーン間で日付と時刻を操作する。日付と時刻の値の書式設定など、夏時間による変更を管理する
  • Instant、Period、Duration および TemporalUnit を使用して、日付に基づくイベントと時刻に基づくイベントを定義、作成および管理する

参考(https://education.oracle.com/ja/java-se-8-programmer-ii/pexam_1Z0-809)

前回は上記の項目をまず読み解くのに必要なクラスの一部を紹介しました。

今回も引き続き残りのクラスを解説するとともに、上記の内容の意味するところを読み解いていければと思います!

なので、前回言ったとおり
上のところに出てくるクラスを1つずつ理解する

という流れで進めていきましょう!

それでは、公式とは少し進行が違うかもしれませんが、内容をどうぞ。

内容

TemporalAccessor

前回も出てきた、java.time.temporalパッケージ(日時を表現するクラスを定義)
の中のクラスです。TemporalAccessorは基本的に最上位クラスのインタフェースなので,
継承する実装クラスの類はほぼありません。

関連クラス

サブインターフェースにTemporalクラスがあり、
Temporalの実装クラスには前回触れた以下があります。

  1. LocalDate
  2. LocalDateTime
  3. LocalTime
  4. OffsetTime
  5. OffsetDateTime

また、TemporalAccessor,Temporalのメソッドには

  1. TemporalUnit
  2. TemporalAmount
  3. TemporalField
  4. TemporalQuery

といった固有の型を引数に取るものが多いです。
その中でもTemporalUnitは比較的重要度が高いため
次節で説明します。

TempralUnit (interface)

前回も出てきた、java.time.temporalパッケージ(日時を表現するクラスを定義)
の中のクラスです。これは、日付や時刻の単位を定義するためのクラスになっています。
後述のChronoUnitの実装元インタフェースになっています。

ChronoUnit (列挙子)

前述の通り、TemporalUnitの実装クラスです。

列挙定数としては単位を示す、という説明の通り、時間の単位を示すものが定義されています。
“DAYS”,”YEARS”,”MONTHS”,”SECONDS”などがあります。

メソッドは基本的に加算、減算、切り捨て、指定する瞬間までの時間量などを
「指定した単位で」計算します。減算のメソッドは以下です。

LocalDateTime minus(long amounts, TemporalUnit unit)
第一引数に量を指定、第二引数に単位を指定、という書き方になっていますね。
これが本クラスの使い方です。
ちなみに、こういったメソッドで作られるオブジェクトの実体の扱いは
問題になりやすい
のですが、

計算メソッドが返すのは計算を施した結果をデータとして持つ元オブジェクトのコピーです。
つまり、元オブジェクトの中身は計算する前のデータになっています。

余談ですが、implements かつ 列挙型
という組み合わせはここまで出てきていないので、
こう言う実装もできる、と気に留めておく良い例のような気もしています。

DateTimeFormatter(前回も少し出ました)

お疲れ様です!これで一応本単元で覚えたいクラスは最後になります。
加えて、前回少し触れた内容なので概念についてはある程度わかっているかもしれませんが、
日付等を文字列から読み出すときに読み込みのルールとするフォーマッタを定義します。

本クラスはコンストラクタが定義されておらず、
インスタンスの取得には大きく分けて2種類の方法があります。
メソッド、定数はどちらも重要なので、前回同様何があるかは覚えた方が安全です

  1. クラスの定数から取得する
  2. ロケール固有フォーマッタを返すメソッドから取得する

定数

定数名概要
BASIC_ISO_DATE基本的なISO日付
ISO_DATEオフセット(時差)の情報を付加できるISO日付
ISO_LOCAL_DATEISOローカル日付
ISO_OFFSET_TIMEオフセット(時差)の情報を付加できるISO時間

メソッド

以下のメソッドは全てstaticなメソッドで、 DateTimeFormatter型のインスタンスを返します。
返す内容は全てISO暦に対するロケール固有のフォーマットです。

メソッド名概要
ofLocalizedDate(FormatStyle style)引数に指定したオプションで
日付フォーマットを返す
ofLocalizedDateTime(FormatStyle style)引数に指定したオプションで
日付と時刻のフォーマットを返す
ofLocalizedDateTime(FormatStyle dateStyle, FormatStyle timeStyle)引数に指定したオプションで
日付と時刻のフォーマットを返す。
日付、時刻で個別に設定を選べる。
ofLocalizedTime(FormatStyle style)引数に指定したオプションで
時刻フォーマットを返す

また、引数にFormatStyleという型のオブジェクトを取っていますが、
これは列挙型で、下記の定数を持っています。内容や表示方法はそれこそ
「ロケール(地域やシステムなど)によって変わる」ので覚えなくていいです。
上から、だんだん文字数が増えていくんだな、こう言うものがあるんだな、
くらいで十分です。

  • SHORT
  • MEDIUM
  • LONG
  • FULL

独自パターン用メソッド

文字列の入力を使って自分でパターンを作り出すこともできます。
正規表現のように区切り文字やルールのある文字が存在するので、
そのルールを覚え切るのはかなりきついと思います(参照←「パターン文字」のあたり)。
なので、関連するメソッドとそのシグニチャだけわかっておけば試験では大丈夫だろうと思います。
(逆に入力パターンを深掘りしている問題集等は見たことないですし、出題率も低いものと思われます)

メソッド名概要
static DateTimeFormatter ofPattern(String pattern)指定パターンのフォーマッタを返す
static DateTimeFormatter ofPattern(String pattern, Locale locale)指定パターンとロケールのフォーマッタを返す

まとめ

今回はjava 8 Gold試験対策として、日付/時刻APIの分野について解説しました。

一度では理解しにくい点も多いと思いますので、読み返したり、実際に手を動かして知識の定着を図っていただければと思います!

それでは、次回またお会いしましょう〜。

コメント

タイトルとURLをコピーしました