🐆
[Java]日付フォーマットのサンプルコード(1873年問題対応)
日付フォーマット用のサンプルコード(覚え書き)
java.time.chrono.JapaneseChronology では、1873年より前の年月日が入力されると、エラーが出るので、回避策として西暦で出力させるようにしました。
概要
- 日付文字列を指定した和暦に変換
- 1873年より前が入力されてきた場合は、西暦に変換させる
ソースコード
Main.java
import java.time.LocalDateTime;
import java.time.chrono.JapaneseChronology;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) throws Exception {
// String pattern = "Gyy/MM/dd";
// String pattern = "GGGGy年MM月dd日";
String pattern = "G.y/MM/dd";
DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern)
.withLocale(Locale.JAPANESE);
/** Gyy/MM/dd
String dateStr = "1872-12-31T23:59:59"; // 西暦72/12/31
String dateStr = "1873-01-01T00:00:00"; // 明治06/01/01
String dateStr = "1989-01-07T23:59:59"; // 昭和64/01/07
String dateStr = "1989-01-08T00:00:00"; // 平成01/01/08
String dateStr = "2019-04-30T23:59:59"; // 平成31/04/30
String dateStr = "2019-05-01T00:00:00"; // 令和01/05/01
**/
/** GGGGy年MM月dd日
String dateStr = "1872-12-31T23:59:59"; // 西暦1872年12月31日
String dateStr = "1873-01-01T00:00:00"; // 明治6年01月01日
String dateStr = "1989-01-07T23:59:59"; // 昭和64年01月07日
String dateStr = "1989-01-08T00:00:00"; // 平成1年01月08日
String dateStr = "2019-04-30T23:59:59"; // 平成31年04月30日
String dateStr = "2019-05-01T00:00:00"; // 令和1年05月01日
**/
/** G.y/MM/dd
String dateStr = "1872-12-31T23:59:59"; // 西暦.1872/12/31
String dateStr = "1873-01-01T00:00:00"; // 明治.6/01/01
String dateStr = "1989-01-07T23:59:59"; // 昭和.64/01/07
String dateStr = "1989-01-08T00:00:00"; // 平成.1/01/08
String dateStr = "2019-04-30T23:59:59"; // 平成.31/04/30
String dateStr = "2019-05-01T00:00:00"; // 令和.1/05/01
**/
String dateStr = "2019-05-01T00:00:00";
System.out.println(formatDate(dateStr, fmt));
}
public static String formatDate(String dateStr, DateTimeFormatter fmt) {
LocalDateTime dateTime= LocalDateTime.parse(dateStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
fmt = dateTime.getYear() >= 1873 ? fmt.withChronology(JapaneseChronology.INSTANCE) : fmt;
return dateTime.format(fmt);
}
}
ポイント
1873年以降かそれより前かで分岐させているところ
fmt = dateTime.getYear() >= 1873 ? fmt.withChronology(JapaneseChronology.INSTANCE) : fmt;
Discussion