例えば、「H30」「S63」などの、アルファベットの元号1字と年のみの文字列に対して、存在する年であるかの検証をしたいと考えています。
「S65」や、「H32」はダメとなります。
(「H31」や、「S64」などは正常値です。)
以下のテストコードで失敗してしまう箇所について悩んでおります。
java
1//テストコード 2 assertThat(Main.isWarekiGyy("H31"), is(true)); 3 assertThat(Main.isWarekiGyy("H01"), is(true)); //※ここでテスト失敗しまう 4 assertThat(Main.isWarekiGyy("H32"), is(false)); 5 assertThat(Main.isWarekiGyy("S65"), is(false));
java
1//実装 2 public static boolean isWarekiGyy(String warekiGyy) { 3 4 Locale japan = new Locale("ja", "JP", "JP"); 5 SimpleDateFormat format = new SimpleDateFormat("Gyy", japan); 6 format.setLenient(false); 7 8 try { 9 format.parse(warekiGyy); 10 return true; 11 } catch (ParseException e) { 12 return false; 13 } 14 }
テスト失敗個所について調査したのですが、どうも月日を指定しないと1月1日として認識されてしまう(?)ため、「H01年01月01日」として存在しない日付になってしまっているようです。
ここまではわかったのですが、ではどうするかについて思案しているところです。
単純に元号ごとにif文で開始日付を渡してからparseするなどしかないでしょうか。
java
1 //こんな感じの処理を挟みこんでGyyMMddでparse? 2 //なんか長くなるが・・ 3 String startDate; 4 switch (warekiGyy.substring(0, 1)) { 5 case "H": 6 startDate = "0108"; 7 break; 8 case "S": 9 startDate = "1225"; 10 break; 11 default: 12 return false; 13 }
上記を入れればたぶんうまく動く気もするのですが、単純に「GYY」ではできないでしょうか。
一応、LocalDate版も作ってみたのですが、こちらもうまくいきません・・。
java
1 public static boolean isWarekiGyy2(String warekiGyy) { 2 3 Locale japan = new Locale("ja", "JP", "JP"); 4 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("Gyy", japan); 5 try { 6 LocalDate.parse(warekiGyy, formatter); 7 return true; 8 } catch (DateTimeParseException e) { 9 return false; 10 } 11 } 12
質問内容は以上です。
何かうまい方法あればお教えください。
よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/01/16 23:55