gpt4 book ai didi

java - DateTimeFormatter 月份模式字母 "L"失败

转载 作者:IT老高 更新时间:2023-10-28 20:29:12 26 4
gpt4 key购买 nike

我注意到 java.time.format.DateTimeFormatter无法按预期解析。见下文:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Play {
public static void tryParse(String d,String f) {
try {
LocalDate.parse(d, DateTimeFormatter.ofPattern(f));
System.out.println("Pass");
} catch (Exception x) {System.out.println("Fail");}
}
public static void main(String[] args) {
tryParse("26-may-2015","dd-L-yyyy");
tryParse("26-May-2015","dd-L-yyyy");
tryParse("26-may-2015","dd-LLL-yyyy");
tryParse("26-May-2015","dd-LLL-yyyy");
tryParse("26-may-2015","dd-M-yyyy");
tryParse("26-May-2015","dd-M-yyyy");
tryParse("26-may-2015","dd-MMM-yyyy");
tryParse("26-May-2015","dd-MMM-yyyy");
}
}

只有使用 tryParse("26-May-2015","dd-MMM-yyyy"); 的最后一次尝试才会“通过”。根据文档 LLL 应该能够解析出文本格式。还要注意大写“M”与小写“m”的细微差别。

这真的很烦人,因为默认情况下我无法解析出 Oracle DB 默认格式化的字符串

SELECT TO_DATE(SYSDATE,'DD-MON-YYYY') AS dt FROM DUAL;

同样,对于以下程序:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Play {
public static void output(String f) {
LocalDate d = LocalDate.now();
Locale l = Locale.US;
// Locale l = Locale.forLanguageTag("ru");
System.out.println(d.format(DateTimeFormatter.ofPattern(f,l)));
}
public static void main(String[] args) {
output("dd-L-yyyy");
output("dd-LLL-yyyy");
output("dd-M-yyyy");
output("dd-MMM-yyyy");
}
}

我得到以下输出:

28-5-2015
28-5-2015
28-5-2015
28-May-2015

显然 L 格式说明符不处理任何文本,对我来说似乎是数字...

但是,如果我将语言环境更改为 Locale.forLanguageTag("ru"),我会得到以下输出:

28-5-2015
28-Май-2015
28-5-2015
28-мая-2015

真的很有趣,你不同意吗?

我的问题是:

  • 我是否有理由期望每一个都可以工作?
  • 我们是否应该至少将其中一些作为错误提交?
  • 我是否误解了 L 模式说明符的用法。

引用文档中我认为“重要”的部分:

Text: The text style is determined based on the number of patternletters used. Less than 4 pattern letters will use the short form.Exactly 4 pattern letters will use the full form. Exactly 5 patternletters will use the narrow form. Pattern letters 'L', 'c', and 'q'specify the stand-alone form of the text styles.

Number: If the count of letters is one, then the value is output usingthe minimum number of digits and without padding. Otherwise, the countof digits is used as the width of the output field, with the valuezero-padded as necessary. The following pattern letters haveconstraints on the count of letters. Only one letter of 'c' and 'F'can be specified. Up to two letters of 'd', 'H', 'h', 'K', 'k', 'm',and 's' can be specified. Up to three letters of 'D' can be specified.

Number/Text: If the count of pattern letters is 3 or greater, use theText rules above. Otherwise use the Number rules above.

更新

我已向 Oracle 提交了两份意见:

  • 请求修复 LLL(长格式文本)问题:JDK-8114833 (原始甲骨文审核 ID:JI-9021661)
  • 小写月份解析问题的增强请求:评论 ID:0(这也是错误吗??)

最佳答案

“独立”月份名称

我相信“L”适用于在月份本身使用不同单词的语言,而不是在日期中使用它的方式。例如:

Locale russian = Locale.forLanguageTag("ru");

asList("MMMM", "LLLL").forEach(ptrn ->
System.out.println(ptrn + ": " + ofPattern(ptrn, russian).format(Month.MARCH))
);

输出:

MMMM: марта
LLLL: Март

在解析日期时不应该使用“L”而不是“M”。

我尝试了以下方法来查看哪些语言环境支持独立的月份名称格式:

Arrays.stream(Locale.getAvailableLocales())
.collect(partitioningBy(
loc -> "3".equals(Month.MARCH.getDisplayName(FULL_STANDALONE, loc)),
mapping(Locale::getDisplayLanguage, toCollection(TreeSet::new))
)).entrySet().forEach(System.out::println);

以下语言从“LLLL”获取特定于区域设置的独立月份名称:

加泰罗尼亚语、中文、克罗地亚语、捷克语、芬兰语、希腊语、匈牙利语、意大利语、立陶宛语、挪威语、波兰语、罗马尼亚语、俄语、斯洛伐克语、土耳其语、乌克兰语

所有其他语言都获得“3”作为 March 的独立名称。

关于java - DateTimeFormatter 月份模式字母 "L"失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30518954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com