DateTimeFormatter.parse 返回无效的日语日期

8 java date java-time datetimeformatter

我正在尝试将日语日期字符串转换为 JapaneseDate。

\n
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("Gyy\xe5\xb9\xb4MM\xe6\x9c\x88dd\xe6\x97\xa5")\n    .withChronology(JapaneseChronology.INSTANCE)\n    .withResolverStyle(ResolverStyle.LENIENT);\nJapaneseDate d = JapaneseDate.from(formatter.parse("\xe5\xb9\xb3\xe6\x88\x9001\xe5\xb9\xb401\xe6\x9c\x8801\xe6\x97\xa5"));\nSystem.out.println(d);\nSystem.out.println(d.format(formatter));\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
Japanese Reiwa 71-01-01\n\xe4\xbb\xa4\xe5\x92\x8c71\xe5\xb9\xb401\xe6\x9c\x8801\xe6\x97\xa5\n
Run Code Online (Sandbox Code Playgroud)\n

由于“\xe4\xbb\xa4\xe5\x92\x8c\xe5\x85\x83\xe5\xb9\xb4”是“2019”,“\xe4\xbb\xa4\xe5\x92\x8c71\xe5\xb9\ xb401\xe6\x9c\x8801\xe6\x97\xa5" 为 "2089-01-01"。\n"\xe5\xb9\xb3\xe6\x88\x9001\xe5\xb9\xb401\xe6\x9c\x8801 \xe6\x97\xa5" 必须是 "1989-01-01"。

\n

我怎样才能正确地转换它?

\n

如果我将解析器样式更改为ResolverStyle.STRICT,它会抛出

\n
java.time.format.DateTimeParseException: Text \'\xe5\xb9\xb3\xe6\x88\x9001\xe5\xb9\xb401\xe6\x9c\x8801\xe6\x97\xa5\'\ncould not be parsed: year, month, and day not valid for Era\n
Run Code Online (Sandbox Code Playgroud)\n

如果我将解析器样式更改为ResolverStyle.SMART,它会抛出

\n
java.time.format.DateTimeParseException: Text \'\xe5\xb9\xb3\xe6\x88\x9001\xe5\xb9\xb401\xe6\x9c\x8801\xe6\x97\xa5\'\ncould not be parsed: Invalid YearOfEra for Era: Heisei 101\n
Run Code Online (Sandbox Code Playgroud)\n

hat*_*ata 5

尝试使用这种模式:

\n
DateTimeFormatter.ofPattern("Gy\xe5\xb9\xb4MM\xe6\x9c\x88dd\xe6\x97\xa5")\n
Run Code Online (Sandbox Code Playgroud)\n
\n

y应该单独使用,否则它将在达到时添加一百年11(参见Java\xe3\x83\x90\xe3\x83\xbc\xe3\x82\xb8\xe3\x83\xa7\xe3\ x83\xb3\xe5\x88\xa5\xe3\x81\xae\xe6\x94\xb9\xe5\x85\x83(\xe6\x96\xb0\xe5\x85\x83\xe5\x8f\xb7)\xe5\ xaf\xbe\xe5\xbf\x9c\xe3\x81\xbe\xe3\x81\xa8\xe3\x82\x81 )。

\n

第11年:

\n
JapaneseDate d = JapaneseDate.from(formatter.parse("\xe5\xb9\xb3\xe6\x88\x9011\xe5\xb9\xb411\xe6\x9c\x8801\xe6\x97\xa5"));\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
Japanese Reiwa 81-11-01\n\xe4\xbb\xa4\xe5\x92\x8c81\xe5\xb9\xb411\xe6\x9c\x8801\n
Run Code Online (Sandbox Code Playgroud)\n

12年级:

\n
JapaneseDate d = JapaneseDate.from(formatter.parse("\xe5\xb9\xb3\xe6\x88\x9012\xe5\xb9\xb411\xe6\x9c\x8801\xe6\x97\xa5"));\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
Japanese Heisei 12-11-01\n\xe5\xb9\xb3\xe6\x88\x9012\xe5\xb9\xb411\xe6\x9c\x8801\n
Run Code Online (Sandbox Code Playgroud)\n