我有类似April 17th, 2024
的输入日期。日期是由谷歌语音到文本服务构建的。
要将此日期格式化为不同的格式,我将使用下一个代码:
String input = "April 17th, 2024";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMM d, uuuu" )
.withLocale( Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
LocalDate ld = zdt.toLocalDate();
DateTimeFormatter fLocalDate = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
String output = ld.format( fLocalDate);
System.out.println(output);
问题是输入日期应该是CCD_ 2或者必须改进模式。
非常严格的解决方案是在数字后面去掉字母。
我宁愿避免添加额外的逻辑,并改进输入数据的日期模式。正是在这个步骤中,我需要帮助(我在javadoc中找不到正确的解决方案(。
所以我希望得到格式化程序的更正或确认,java不支持日期可以是17th
、3rd
等的标准
似乎java.time
不支持序数。
a";模式解决方案";我可以想到,将是一个使用可选部分(即[
和]
之间的字符(的:MMMM d['th']['st']['nd']['rd'], yyyy
例如:
jshell> var fmt = DateTimeFormatter.ofPattern("MMMM d['th']['st']['nd']['rd'], yyyy").withLocale(Locale.US)
fmt ==> Text(MonthOfYear)' 'Value(DayOfMonth)['th']['st'] ... earOfEra,4,19,EXCEEDS_PAD)
jshell> LocalDate.parse("April 17th, 2024", fmt)
$63 ==> 2024-04-17
jshell> LocalDate.parse("April 1st, 2024", fmt)
$64 ==> 2024-04-01
jshell> LocalDate.parse("April 3rd, 2024", fmt)
$65 ==> 2024-04-03
jshell> LocalDate.parse("April 4, 2024", fmt)
$66 ==> 2024-04-04
它将拒绝其他字符:
jshell> LocalDate.parse("April 1fo, 2024", fmt)
| Exception java.time.format.DateTimeParseException: Text 'April 1fo, 2024' could not be parsed at index 7
| at DateTimeFormatter.parseResolved0 (DateTimeFormatter.java:2046)
| at DateTimeFormatter.parse (DateTimeFormatter.java:1948)
| at LocalDate.parse (LocalDate.java:428)
| at (#68:1)
jshell> LocalDate.parse("April 1baar, 2024", fmt)
| Exception java.time.format.DateTimeParseException: Text 'April 1baar, 2024' could not be parsed at index 7
| at DateTimeFormatter.parseResolved0 (DateTimeFormatter.java:2046)
| at DateTimeFormatter.parse (DateTimeFormatter.java:1948)
| at LocalDate.parse (LocalDate.java:428)
| at (#69:1)
但它将接受例如April 1th, 2024
,即使不是严格正确的:
jshell> LocalDate.parse("April 1th, 2024", fmt)
$67 ==> 2024-04-01
并且它也将接受CCD_ 10。我不知道是否会有问题:
jshell> LocalDate.parse("January 3thstndrd, 2024", fmt)
$97 ==> 2024-01-03
Java的日期格式化程序/解析器不支持序数。
您喜欢什么并不重要,在调用解析器之前,您必须自己删除序号后缀。
它真的没有那么糟糕,例如
ZonedDateTime zdt = ZonedDateTime.parse( input.replaceFirst("(?:st|nd|rd|th),", ",") , f );