🐆

[Java]日付フォーマットのサンプルコード(1873年問題対応)

2024/03/11に公開

日付フォーマット用のサンプルコード(覚え書き)
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