fork download
import java.time.LocalDate;
import java.time.chrono.JapaneseDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;


/*
プログラミングのお題スレ Part15 
//mevius.5ch.net/test/read.cgi/tech/1564310397/521-523

521 名前:さまよえる蟻人間 ◆T6xkBnTXz7B0 [sage] 投稿日:2019/09/21(土) 20:51:54.21 ID:BmADEcuL [1/3]
お題: 与えられた西暦年月日を年号年月日に変換しなさい。ただし、変換するのは大正時代から令和までとし、範囲外であればERRORを表示しなさい。

522 名前:さまよえる蟻人間 ◆T6xkBnTXz7B0 [sage] 投稿日:2019/09/21(土) 21:04:33.10 ID:BmADEcuL [2/3]
お題: YYYY/MM/DD形式で与えられた西暦年月日の文字列が正しい年月日を表しているかどうか判定せよ。

523 名前:蟻人間 ◆T6xkBnTXz7B0 [sage] 投稿日:2019/09/21(土) 21:24:10.22 ID:BmADEcuL [3/3]
>>522, >>521の順に解いて下さい。

1970/01/05
1990/12/31
2019/04/28
2019/05/01
1920/02/29
*/
class Ideone
{
    static final DateTimeFormatter DATE_PARSE     = DateTimeFormatter.ofPattern("yyyy/MM/dd", Locale.JAPAN);
    static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("GGGGy年M月d日", Locale.JAPAN);

    public static void main(String[] args)
    {
        String[] list = {
                "1970/01/05",
                "1990/12/31",
                "2019/04/28",
                "2019/05/01",

                "1920/02/29",
                "1920/02/30",
                "2019/02/28",
                "2019/02/29",

                "1912/07/29", // 明治終わり
                "1912/07/30", "1926/12/24", // 大正
                "1926/12/25", "1989/01/07", // 昭和
                "1989/01/08", "2019/04/30", // 平成
                "2019/05/01" // 令和
        };

        for (String s : list)
            test(s);
    }

    static void test(String s)
    {
        System.out.printf("%s => %s%n", s, isValidDate(s) ? toGengoDateString(s) : "正しくない日付");
    }

    static boolean isValidDate(String s)
    {
        LocalDate date = LocalDate.parse(s, DATE_PARSE);
        return DATE_PARSE.format(date).equals(s);
    }

    static String toGengoDateString(String s)
    {
        try
        {
            JapaneseDate date = JapaneseDate.from(LocalDate.parse(s, DATE_PARSE));
            String ret = DATE_FORMATTER.format(date);

            // 明治は範囲外
            if (!ret.contains("明治")) return ret;
        } catch (Exception e)
        {
        }
        return "ERROR";
    }
}
Success #stdin #stdout 0.16s 37736KB
stdin
Standard input is empty
stdout
1970/01/05 => 昭和45年1月5日
1990/12/31 => 平成2年12月31日
2019/04/28 => 平成31年4月28日
2019/05/01 => 令和1年5月1日
1920/02/29 => 大正9年2月29日
1920/02/30 => 正しくない日付
2019/02/28 => 平成31年2月28日
2019/02/29 => 正しくない日付
1912/07/29 => ERROR
1912/07/30 => 大正1年7月30日
1926/12/24 => 大正15年12月24日
1926/12/25 => 昭和1年12月25日
1989/01/07 => 昭和64年1月7日
1989/01/08 => 平成1年1月8日
2019/04/30 => 平成31年4月30日
2019/05/01 => 令和1年5月1日