こんにちは!フリーライターの中井です。
Javaには日付の管理を行うDateクラスがあります。この記事では、
- Date型のフォーマットとは
- フォーマットを整え日本語らしい表示にする方法
- Date型の比較をする方法
という基本的な内容から、
- 不正な日付をチェックする方法
- Date型とString型を相互に変換する方法
などの応用的な使い方に関しても解説していきます。
なお、Javaの記事については、こちらにまとめています。
Date型のフォーマットとは
日本語らしく表示するためのツール
Date型のフォーマットは、日付をわかりやすく表示するために用意されています。試しにシンプルにDate型を使い、今日の日付を取得しても結果は以下のように表示されます。
Thu Apr 06 14:45:52 JST 2017
あなたは、この結果をみて分かりやすいと感じたでしょうか?ほぼ99%の人がこの表示は分かりにくいと感じていることでしょう。2017年4月6日木曜日14時28分45秒と表示すると一段と分かりやすくなります。
では、フォーマットの使い方を理解して分かりやすい日本語表記にしていきましょう。
フォーマットの使い方
フォーマットを使うには、SimpleDateFormatクラスを使用します。このクラスで誰の目から見ても分かりやすい日本語の日付表示に直すことができます。
import java.text.SimpleDateFormat; import java.util.Date; public class JavaDateSample { public static void main(String[] args) { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy'年'MM'月'dd'日'E'曜日'k'時'mm'分'ss'秒'"); System.out.println(sdf.format(date)); } }
実行結果
2017年04月06日木曜日14時50分52秒
- SimpleDateFormatはjava.textパッケージに含まれるのでimport文を記載
- SimpleDateFormatをインスタンス化しフォーマットを指定
(今回は、2017年04月06日木曜日14時50分52秒と出るように指定しています)
重要なのは、フォーマットの指定方法です。フォーマットに日本語を混ぜたい場合には、(シングルクォテーション)で挟み込みます。
例えば、2017年と表示させたいときは”yyyy’年’”と年の前後に’を使いましょう。またyは年、Mは月、dは日、Eは曜日、kは時、mは分、sは秒と決まっているので合わせて覚えると自分なりに分かりやすいフォーマットをすんなり作ることができます。
フォーマットでよく使われるパターン文字
パターン文字とは、フォーマットを指定する時にyyyyやMMやddそしてkやEのことを指します。今回では、プログラムを組む時に、よく使うパターン文字を表にしたので合わせて覚えておきましょう。
時間 | パターン文字と説明 |
---|---|
年 | y (yyと打つと西暦の下2桁17が表示、yyyyと打つと西暦2017が表示される)) |
月 | M(月を表示。MMと打つと1~9月の場合は01~09と0がつく。M1個の場合は0がつかない。間違えてmと打つと時間の分と認識されるので注意が必要) |
日 | d(日を表示。ddと打つと1~9日の場合は01~09と0がつく。d1個の場合は0がつかない) |
曜日 | E(曜日を表示する。日月火水木金土と日本語表示になる) |
時 | k(時間を表示。kを指定すると24時間表記になり分かりやすい) |
h(時間を表示するが12時間制。午前か午後か分からないので、hを使う場合は前にa(午前か午後を時間から自動判別)を使わないと混同のもと。hhで1~9時の間に0がつく。) | |
分 | m(分を表示。mmで1~9分の間に0がつく。m1個だと0がつかない。) |
秒 | s(秒を表示。ssで1~9秒のときに0がつく。s1個だと0がつかない。) |
ミリ秒 | S(ミリ秒を表示。小文字のsを書くと秒を認識されるので注意) |
Date型の比較をする方法
Date型の比較する方法は、compareToメソッドを使用します。詳細は以下からお願いします。
不正な日付をチェックする方法
例えば、日付に4月32日と打ったとしましょう。もちろん、我々の目視ではこの日付間違っているとわかりますが、そのままプログラムを組むと、この日付は5月1日と勝手に認識されチェックが通ってしまいます。
それでは困りますよね?きちんと日付ではないことを明確にしてやるには、SimpleDateFormatクラスのsetLenientメソッドを使います。
setLenientメソッドの書き方
sdf(クラスの変数名).setLenient(false);
- setLenientメソッドの引数は、trueかfalseのboolean型
- falseにすると、厳格な日付のチェックが行なえます
- 単独では使用されず、必ずクラス名の変数とセットで使います
setLenientメソッドの使い方
import java.text.ParseException; import java.text.SimpleDateFormat; public class Main { public static void main(String[] args) { String strDate = "2017/04/32"; try{ SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); sdf.setLenient(false); sdf.parse(strDate); System.out.println(strDate + "は日付です"); }catch(ParseException e){ System.out.println(strDate + "は日付ではありません"); } } }
実行結果
2017/04/32は日付ではありません
- sdf.setLenient(false)で、日付のチェックを厳格化
- sdf.parse(strDate)で文字列の日付をDate型に変換するときにチェック行い、正しい日付でない場合にParseExceptionの例外を発生
このプログラムは、2017/4/32の日付は厳格にチェックを行い日付ではないことをエラーとして出力しています。初期の状態ではsetLenientはtrueになっているので、厳格にチェックをする場合は、setLenientメソッドをfalseにすることを忘れないでください。
Date型とString型を相互に変換する方法
Date型からString型に変更するには、フォーマットを指定してから変換し、String型からDate型に変換するには、sdf.parse(strDate文字列型)で変換します。詳細は以下からお願いします。
Date型についてもっと詳しく知りたい方へ
Dateクラスのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
まとめ
今回は、Date型におけるフォーマットの使い方と、誤りな日付を指定するとエラーで返す方法をメインでお伝えしました。日付のフォーマットは、大文字、小文字と区別して覚えないときちんとしたプログラムが組めなくなるから要注意です。
M(月)とm(分)、s(秒)とS(ミリ秒)はそれぞれ意味が違うのできっちりと理解しましょう。日付を理解しているとゲームにおける日付指定のオプションが組めるようになります。