date格式

0wi1tuuw  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(302)

这个问题在这里已经有答案了

在java中解析格式“2010年1月10日”的日期(带顺序指示器,st | nd | rd | th)(4个答案)
您如何将一个月的某一天格式化为“11”、“21”或“23”(顺序指示符)(20个答案)
上个月关门了。
我有输入日期 April 17th, 2024 . 这个日期是由google语音到文本服务构建的。
要将此日期格式化为不同的格式,我将使用下一个代码:

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

…问题是输入日期应该是 April 17, 2024 或者说模式需要改进。
非常严格的解决办法是在数字后删掉字母。
我更希望避免添加额外的逻辑,并改进输入数据的日期模式。正是这一步我需要帮助(我在javadoc中找不到正确的解决方案)。
因此,我希望得到格式化程序的更正或确认,即java不支持日期可以为空的标准 17th , 3rd 等等。

lskq00tm

lskq00tm1#

java的日期格式化程序/解析器不支持序数。
你喜欢什么并不重要,在调用解析器之前,你必须自己删除序数后缀。
其实没那么糟。

ZonedDateTime zdt = ZonedDateTime.parse( input.replaceFirst("(?:st|nd|rd|th),", ",") , f );
fxnxkyjh

fxnxkyjh2#

看来 java.time 不支持序数。
我能想到的一个“模式解决方案”是使用可选部分(即字符之间的部分) [ 以及 ] ): 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

它也会接受 January 3thstndrd, 2024 . 我不知道是否有问题:

jshell> LocalDate.parse("January 3thstndrd, 2024", fmt)
$97 ==> 2024-01-03

相关问题