この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
DBのテストデータに様々な年月の作成が必要だったので、調べて専用のメソッドを作成しました。 Javaのバージョンが1.7以下の場合にも使用できるので、備忘録として記載しておきます。
環境
Mac OSX 10.10.5 Yosemite Java 1.7.0_79 Eclipse Mars 2
目的
期間を指定してランダムな年月日を文字列で取得する。
コード
/**
* ランダムな年月日を文字列で取得する。
* @return 年月日を文字列で返す。
*/
private static String createDate() {
// 開始日
Calendar dateStart = Calendar.getInstance();
dateStart.set(1997, 1, 1);
// 終了日
Calendar dateEnd = Calendar.getInstance();
// 期間日数
long dateDiff = (dateEnd.getTimeInMillis() - dateStart.getTimeInMillis())
/ (1000 * 60 * 60 * 24);
// ランダムな年月日の生成
Calendar dateRandom = Calendar.getInstance();
dateRandom.add(dateEnd.DATE, - new Random().nextInt((int)dateDiff));
// 取得形式の設定
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String date = sdf.format(dateRandom.getTime());
// 確認
System.out.println("開始日 : " + sdf.format(dateStart.getTime()));
System.out.println("終了日 : " + sdf.format(dateEnd.getTime()));
System.out.println("期間日数 : " + dateDiff);
System.out.println("生成年月日 : " + date);
System.out.println("生成年月日 : " + dateRandom.getTime());
return date;
}
開始日(7〜8行目) Calendarのインスタンスを取得し、年月日を設定。 時間まで指定したい場合は、第3引数〜第5引数で時・分・秒を設定可能です。 ただし月は0スタートなので、上記の様に"1"を指定すると"2月"になるので、 下記の様にする事も可能です。
dateStart.setTime(new Date("1997/01/01"));
終了日(11行目) Calendarのインスタンスを取得するだけで、現在の年月日などを取得できます。
期間日数(14〜15行目) 終了日から開始日をそれぞれミリ秒で取得し、マイナスして期間を算出。 その後、日数に変換しています。
ランダムな年月日の生成(18〜19行目) Calendarのインスタンスを取得し、add()で生成。 第1引数:終了日。 第2引数:Random()で期間日数を引数にして乱数を生成。
取得形式を設定(22〜23行目) "2016-09-05"の形で取得したいので、SimpleDateFormatに"yyyy-MM-dd"を設定してから、生成したランダムな年月日を設定。 文字列で取得しています。
上記内容の確認(26〜30行目)
生成した年月日を返す(32行目)
実行結果
開始日 : 1997-02-01
終了日 : 2016-09-04
期間日数 : 7155
生成年月日 : 2015-01-12
生成年月日 : Mon Jan 12 19:17:39 JST 2015
おまけ
実行結果の最後の行はSimpleDateFormatを使用しなかった場合です。 この例ではJSTと表示されているので日本標準時で取得できていますが、指定が必要な場合は下記の様にします。
dateEnd.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
確認が必要無ければ22〜23行目は下記の様にシンプルにしても良いですね。
String date = new SimpleDateFormat("yyyy-MM-dd").format(dateRandom.getTime());
さいごに
都合により上記のコードになりましたが、実際に使用する場合はメソッドの引数に開始と終了の年月日を渡す様にした方が良いですね。 今度はJava8用の日付APIについて調べてみます。