java8の日付、時刻型はいろいろクラスが用意されていて、
多機能な反面ぱっと使いずらい(和暦はJapaneseDateで扱えるけど時間情報は持たないなど)ので、
任意の日時を任意のフォーマットで出力するユーティリティメソッドを考えてみました。
DateTimeFormat.java
import java.time.LocalTime;
import java.time.chrono.ChronoLocalDateTime;
import java.time.chrono.JapaneseDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.util.Locale;
import java.util.function.Function;
@SuppressWarnings("javadoc")
public class DateTimeFormat {
public static String dateTimeFormat(String format) {
return dateTimeFormat(format, Function.identity());
}
public static String dateTimeFormat(String format, Function<ChronoLocalDateTime<JapaneseDate>, ChronoLocalDateTime<JapaneseDate>> modify) {
return modify.apply(JapaneseDate.now().atTime(LocalTime.now())).format(DateTimeFormatter.ofPattern(format, Locale.JAPAN));
}
public static void main(String[] __) {
// 現在日時
System.out.println(dateTimeFormat("uuuu/MM/dd(E) HH:mm:ss"));
System.out.println(dateTimeFormat("Gy年M月d日(EEEE)H時m分s秒"));
System.out.println(dateTimeFormat("GGGGGy.M.d"));
// 今月の末日
System.out.println(dateTimeFormat("uuuu/MM/dd(E)", d -> d.with(ChronoField.DAY_OF_MONTH, d.toLocalDate().lengthOfMonth())));
// 一週間後
System.out.println(dateTimeFormat("Gy年M月d日(E)", d -> d.plus(7, ChronoUnit.DAYS)));
// 来月1日
System.out.println(dateTimeFormat("GGGGGy.M.d", d -> d.with(ChronoField.DAY_OF_MONTH, 1).plus(1, ChronoUnit.MONTHS)));
}
}
実行結果
2017/06/15(木) 11:30:05
平成29年6月15日(木曜日)11時30分5秒
H29.6.15
2017/06/30(金)
平成29年6月22日(木)
H29.7.1