import java.time.LocalDate;
import java.time.chrono.JapaneseDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.regex.Pattern;
/*
プログラミングのお題スレ 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); static final Pattern GANNEN_PATTERN = Pattern.compile("(?<!\\d)1年");
public static void main
(String[] args
) {
"1970/01/05",
"1990/12/31",
"2019/04/28",
"2019/05/01",
"1920/02/29",
"1920/02/30",
"2019/02/28",
"2019/02/29",
"1999/01/01", // 平成11年が元年にならないかどうかのチェック
"1912/07/29", // 明治終わり
"1912/07/30", "1926/12/24", // 大正
"1926/12/25", "1989/01/07", // 昭和
"1989/01/08", "2019/04/30", // 平成
"2019/05/01" // 令和
};
test(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);
}
{
try
{
JapaneseDate date = JapaneseDate.from(LocalDate.parse(s, DATE_PARSE));
String ret
= DATE_FORMATTER.
format(date
); ret = GANNEN_PATTERN.matcher(ret).replaceFirst("元年");
// 明治は範囲外
if (!ret.contains("明治")) return ret;
{
}
return "ERROR";
}
}
aW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGU7CmltcG9ydCBqYXZhLnRpbWUuY2hyb25vLkphcGFuZXNlRGF0ZTsKaW1wb3J0IGphdmEudGltZS5mb3JtYXQuRGF0ZVRpbWVGb3JtYXR0ZXI7CmltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwppbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CgovKgrjg5fjg63jgrDjg6njg5/jg7PjgrDjga7jgYrpoYzjgrnjg6wgUGFydDE1IAovL21ldml1cy41Y2gubmV0L3Rlc3QvcmVhZC5jZ2kvdGVjaC8xNTY0MzEwMzk3LzUyMS01MjMKCjUyMSDlkI3liY3vvJrjgZXjgb7jgojjgYjjgovon7vkurrplpMg4peGVDZ4a0JuVFh6N0IwIFtzYWdlXSDmipXnqL/ml6XvvJoyMDE5LzA5LzIxKOWcnykgMjA6NTE6NTQuMjEgSUQ6Qm1BREVjdUwgWzEvM10K44GK6aGMOiDkuI7jgYjjgonjgozjgZ/opb/mmqblubTmnIjml6XjgpLlubTlj7flubTmnIjml6XjgavlpInmj5vjgZfjgarjgZXjgYTjgILjgZ/jgaDjgZfjgIHlpInmj5vjgZnjgovjga7jga/lpKfmraPmmYLku6PjgYvjgonku6Tlkozjgb7jgafjgajjgZfjgIHnr4Tlm7LlpJbjgafjgYLjgozjgbBFUlJPUuOCkuihqOekuuOBl+OBquOBleOBhOOAggoKNTIyIOWQjeWJje+8muOBleOBvuOCiOOBiOOCi+ifu+S6uumWkyDil4ZUNnhrQm5UWHo3QjAgW3NhZ2VdIOaKleeov+aXpe+8mjIwMTkvMDkvMjEo5ZyfKSAyMTowNDozMy4xMCBJRDpCbUFERWN1TCBbMi8zXQrjgYrpoYw6IFlZWVkvTU0vRETlvaLlvI/jgafkuI7jgYjjgonjgozjgZ/opb/mmqblubTmnIjml6Xjga7mloflrZfliJfjgYzmraPjgZfjgYTlubTmnIjml6XjgpLooajjgZfjgabjgYTjgovjgYvjganjgYbjgYvliKTlrprjgZvjgojjgIIKCjUyMyDlkI3liY3vvJron7vkurrplpMg4peGVDZ4a0JuVFh6N0IwIFtzYWdlXSDmipXnqL/ml6XvvJoyMDE5LzA5LzIxKOWcnykgMjE6MjQ6MTAuMjIgSUQ6Qm1BREVjdUwgWzMvM10KPj41MjIsID4+NTIx44Gu6aCG44Gr6Kej44GE44Gm5LiL44GV44GE44CCCgoxOTcwLzAxLzA1CjE5OTAvMTIvMzEKMjAxOS8wNC8yOAoyMDE5LzA1LzAxCjE5MjAvMDIvMjkKKi8KY2xhc3MgSWRlb25lCnsKICAgIHN0YXRpYyBmaW5hbCBEYXRlVGltZUZvcm1hdHRlciBEQVRFX1BBUlNFICAgICA9IERhdGVUaW1lRm9ybWF0dGVyLm9mUGF0dGVybigieXl5eS9NTS9kZCIsIExvY2FsZS5KQVBBTik7CiAgICBzdGF0aWMgZmluYWwgRGF0ZVRpbWVGb3JtYXR0ZXIgREFURV9GT1JNQVRURVIgPSBEYXRlVGltZUZvcm1hdHRlci5vZlBhdHRlcm4oIkdHR0d55bm0TeaciGTml6UiLCBMb2NhbGUuSkFQQU4pOwogICAgc3RhdGljIGZpbmFsIFBhdHRlcm4gR0FOTkVOX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIig/PCFcXGQpMeW5tCIpOwoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCiAgICB7CiAgICAgICAgU3RyaW5nW10gbGlzdCA9IHsKICAgICAgICAgICAgICAgICIxOTcwLzAxLzA1IiwKICAgICAgICAgICAgICAgICIxOTkwLzEyLzMxIiwKICAgICAgICAgICAgICAgICIyMDE5LzA0LzI4IiwKICAgICAgICAgICAgICAgICIyMDE5LzA1LzAxIiwKCiAgICAgICAgICAgICAgICAiMTkyMC8wMi8yOSIsCiAgICAgICAgICAgICAgICAiMTkyMC8wMi8zMCIsCiAgICAgICAgICAgICAgICAiMjAxOS8wMi8yOCIsCiAgICAgICAgICAgICAgICAiMjAxOS8wMi8yOSIsCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICIxOTk5LzAxLzAxIiwgLy8g5bmz5oiQMTHlubTjgYzlhYPlubTjgavjgarjgonjgarjgYTjgYvjganjgYbjgYvjga7jg4Hjgqfjg4Pjgq8KCiAgICAgICAgICAgICAgICAiMTkxMi8wNy8yOSIsIC8vIOaYjuayu+e1guOCj+OCigogICAgICAgICAgICAgICAgIjE5MTIvMDcvMzAiLCAiMTkyNi8xMi8yNCIsIC8vIOWkp+atowogICAgICAgICAgICAgICAgIjE5MjYvMTIvMjUiLCAiMTk4OS8wMS8wNyIsIC8vIOaYreWSjAogICAgICAgICAgICAgICAgIjE5ODkvMDEvMDgiLCAiMjAxOS8wNC8zMCIsIC8vIOW5s+aIkAogICAgICAgICAgICAgICAgIjIwMTkvMDUvMDEiIC8vIOS7pOWSjAogICAgICAgIH07CgogICAgICAgIGZvciAoU3RyaW5nIHMgOiBsaXN0KQogICAgICAgICAgICB0ZXN0KHMpOwogICAgfQoKICAgIHN0YXRpYyB2b2lkIHRlc3QoU3RyaW5nIHMpCiAgICB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiVzID0+ICVzJW4iLCBzLCBpc1ZhbGlkRGF0ZShzKSA/IHRvR2VuZ29EYXRlU3RyaW5nKHMpIDogIuato+OBl+OBj+OBquOBhOaXpeS7mCIpOwogICAgfQoKICAgIHN0YXRpYyBib29sZWFuIGlzVmFsaWREYXRlKFN0cmluZyBzKQogICAgewogICAgICAgIExvY2FsRGF0ZSBkYXRlID0gTG9jYWxEYXRlLnBhcnNlKHMsIERBVEVfUEFSU0UpOwogICAgICAgIHJldHVybiBEQVRFX1BBUlNFLmZvcm1hdChkYXRlKS5lcXVhbHMocyk7CiAgICB9CgogICAgc3RhdGljIFN0cmluZyB0b0dlbmdvRGF0ZVN0cmluZyhTdHJpbmcgcykKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIEphcGFuZXNlRGF0ZSBkYXRlID0gSmFwYW5lc2VEYXRlLmZyb20oTG9jYWxEYXRlLnBhcnNlKHMsIERBVEVfUEFSU0UpKTsKICAgICAgICAgICAgU3RyaW5nIHJldCA9IERBVEVfRk9STUFUVEVSLmZvcm1hdChkYXRlKTsKICAgICAgICAgICAgcmV0ID0gR0FOTkVOX1BBVFRFUk4ubWF0Y2hlcihyZXQpLnJlcGxhY2VGaXJzdCgi5YWD5bm0Iik7CgogICAgICAgICAgICAvLyDmmI7msrvjga/nr4Tlm7LlpJYKICAgICAgICAgICAgaWYgKCFyZXQuY29udGFpbnMoIuaYjuayuyIpKSByZXR1cm4gcmV0OwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgIHsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJFUlJPUiI7CiAgICB9Cn0K