具有特殊模式的日期格式



我有类似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不支持日期可以是17th3rd等的标准

似乎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 );

相关内容

  • 没有找到相关文章

最新更新