fork download
  1. import java.time.LocalDate;
  2. import java.time.chrono.JapaneseDate;
  3. import java.time.format.DateTimeFormatter;
  4. import java.util.Locale;
  5. import java.util.regex.Pattern;
  6.  
  7. /*
  8. プログラミングのお題スレ Part15
  9. //mevius.5ch.net/test/read.cgi/tech/1564310397/521-523
  10.  
  11. 521 名前:さまよえる蟻人間 ◆T6xkBnTXz7B0 [sage] 投稿日:2019/09/21(土) 20:51:54.21 ID:BmADEcuL [1/3]
  12. お題: 与えられた西暦年月日を年号年月日に変換しなさい。ただし、変換するのは大正時代から令和までとし、範囲外であればERRORを表示しなさい。
  13.  
  14. 522 名前:さまよえる蟻人間 ◆T6xkBnTXz7B0 [sage] 投稿日:2019/09/21(土) 21:04:33.10 ID:BmADEcuL [2/3]
  15. お題: YYYY/MM/DD形式で与えられた西暦年月日の文字列が正しい年月日を表しているかどうか判定せよ。
  16.  
  17. 523 名前:蟻人間 ◆T6xkBnTXz7B0 [sage] 投稿日:2019/09/21(土) 21:24:10.22 ID:BmADEcuL [3/3]
  18. >>522, >>521の順に解いて下さい。
  19.  
  20. 1970/01/05
  21. 1990/12/31
  22. 2019/04/28
  23. 2019/05/01
  24. 1920/02/29
  25. */
  26. class Ideone
  27. {
  28. static final DateTimeFormatter DATE_PARSE = DateTimeFormatter.ofPattern("yyyy/MM/dd", Locale.JAPAN);
  29. static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("GGGGy年M月d日", Locale.JAPAN);
  30. static final Pattern GANNEN_PATTERN = Pattern.compile("(?<!\\d)1年");
  31.  
  32. public static void main(String[] args)
  33. {
  34. String[] list = {
  35. "1970/01/05",
  36. "1990/12/31",
  37. "2019/04/28",
  38. "2019/05/01",
  39.  
  40. "1920/02/29",
  41. "1920/02/30",
  42. "2019/02/28",
  43. "2019/02/29",
  44.  
  45. "1999/01/01", // 平成11年が元年にならないかどうかのチェック
  46.  
  47. "1912/07/29", // 明治終わり
  48. "1912/07/30", "1926/12/24", // 大正
  49. "1926/12/25", "1989/01/07", // 昭和
  50. "1989/01/08", "2019/04/30", // 平成
  51. "2019/05/01" // 令和
  52. };
  53.  
  54. for (String s : list)
  55. test(s);
  56. }
  57.  
  58. static void test(String s)
  59. {
  60. System.out.printf("%s => %s%n", s, isValidDate(s) ? toGengoDateString(s) : "正しくない日付");
  61. }
  62.  
  63. static boolean isValidDate(String s)
  64. {
  65. LocalDate date = LocalDate.parse(s, DATE_PARSE);
  66. return DATE_PARSE.format(date).equals(s);
  67. }
  68.  
  69. static String toGengoDateString(String s)
  70. {
  71. try
  72. {
  73. JapaneseDate date = JapaneseDate.from(LocalDate.parse(s, DATE_PARSE));
  74. String ret = DATE_FORMATTER.format(date);
  75. ret = GANNEN_PATTERN.matcher(ret).replaceFirst("元年");
  76.  
  77. // 明治は範囲外
  78. if (!ret.contains("明治")) return ret;
  79. } catch (Exception e)
  80. {
  81. }
  82. return "ERROR";
  83. }
  84. }
  85.  
Success #stdin #stdout 0.13s 37812KB
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 => 令和元年5月1日
1920/02/29 => 大正9年2月29日
1920/02/30 => 正しくない日付
2019/02/28 => 平成31年2月28日
2019/02/29 => 正しくない日付
1999/01/01 => 平成11年1月1日
1912/07/29 => ERROR
1912/07/30 => 大正元年7月30日
1926/12/24 => 大正15年12月24日
1926/12/25 => 昭和元年12月25日
1989/01/07 => 昭和64年1月7日
1989/01/08 => 平成元年1月8日
2019/04/30 => 平成31年4月30日
2019/05/01 => 令和元年5月1日