はじめに
java.textパッケージには、日付や数値に代入された
などの日付・時刻形式データを、任意の日付時刻フォーマットに変換するクラスが提供されています。
簡単に言うと「このデータは、この形式で日時データとして解釈できますよ」と教えてあげるための書き方になります。
Step1: SimpleDateFormat
日時フォーマットの変換には SimpleDateFormat クラスを使用します。
フォーマットパターンの指定により、 様々なフォーマットで日付・時刻を表示できるようになります。
下記の表は、SimpleDateFormat クラスで用意されているパターン文字一覧です。
上記のパターン文字を使用して、 日時を整形し表現します。
特に、年月日と時間を表す
の6パターンはよく使うので要チェックです。
では、日時形式のデータをどのように日付・時刻データへ変換するのか実際に見ていきましょう。
※intやStringに代入されているデータは、あくまでも「数値」と「文字列」です。
「2018/01/01 23:59:00」 といった日付・時刻形式でデータが代入されていても、それは「日時の形をしているデータ」に過ぎないので、Javaは日時データとして認識してくれません。
日時データとして認識させてあげるには、必ず「日時データ」へ変換する処理を書いてあげる必要があるのです。
例)
冒頭で登場したStringクラスの日時形式データ、
を日時データに変換したい場合は、
といったように、SimpleDateFormatの引数へ日時データに変換したいデータと同じパターンを記述し、
Stringクラスの日時形式データを日時データへ変換する準備をします。
※1:今回は「String dateTime = “2018/01/01 00:00:00″」 日時データに変換したいため、同一パターンの「yyyy/MM/dd HH:mm:ss」 を記述しています。
※2:ここでパターンの記述を間違えると、parseExceptionエラー解析ができませんといった旨のエラー)が発生してしまうので気をつけましょう。
次に、作成したSimpleDateFormat型の変数 「sdf」を使用して、日時データであることを表す Date型への変換を行います。
SimpleDateFormat.parseの引数へ、 Date型に変換したい値を渡すことで、引数に指定したデータのパターン
と、SimpleDateFormatに記述したデータパターン
が一致する場合、 Date型に変換後の値が代入されます。
最後に、変換後の値が代入されたDate型変数 「date」 の中身を見てみましょう。
【出力結果】
Stringクラスの日時形式データが、 Date型の日時データに変換されました。
【サンプルコード】
以上が、日時型データを日時データに変換する処理の簡単な流れとなります。
一例として、実際の作業手順としては、
1.ユーザーが入力した日時をStringで受け取る
2.受け取った値を SimpleDateFormat で解析してDate型に変換
3. 変換したDate型変数から年だけを取り出し、取り出した年を用いて何らかの処理を記述する
といった流れになります。
【出力結果】
上記の例は一例ですが、 SimpleDateFormatは
- 年や月といったデータを処理中で使用したい場合
- ライブラリを使用する際、 所定の形式へ変換する必要がある場合
に使用するケースがほとんどです。
SimpleDateFormatを使用して作成したデータの用途 「こうやって使うこともあるんだな」くらいに覚えておけば大丈夫ですが、
記述する機会も多いため、今のうちにしっかりと把握しておきましょう。
おまけ DateTimeFormatterについて
SimpleDateFormat とよく似た機能として、DateTimeFormatter が存在します。
日時パターンへ変換するという処理は SimpleDateFormat と同様ですが、いくつか異なる点もありますのでご紹介しましょう。
SimpleDateFormatを使用する際は、
といったように自インスタンスを生成しますが、 DateTimeFormatterの場合は
の一行でパターンの指定が可能です。 newしない分消費メモリの節約ができます。
その後 LocalDateTime を使用することで、上記で作成したフォーマットパターンを日時型データに反映させ、日時型データを日時データへ変換します。
ちなみに、.parse内の第一引数は固定値でなくても大丈夫です。
【出力結果】
書き方は多少異なっていても、それぞれ日時形式のデータが出力されていることを確認できます。
処理の流れは SimpleDateFormat も DateTimeFormatter も大きな違いはありませんし、現場によって使用を推奨されるクラスが異なるケースもあります。
(SimpleDateFormat は new でインスタンスを生成するため、性能要件を満たすには DateTimeFormatter を使うほうが望ましい……などなど) どちらを使うことになっても迷わないよう、「こういう書き方もあるんだな」と今のうちに覚えておいてしまいましょう。)
