日期时间格式化程序月份模式字母“L”失败“独立”月份名称
我注意到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");
}
}
只有最后一次尝试将“通过”。根据文档应该能够解析出文本格式。还要注意大写“M”与小写“m”的细微差别。tryParse("26-May-2015","dd-MMM-yyyy");
LLL
这真的很烦人,因为默认情况下我无法解析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
引用文档中我认为“重要”的部分:
发短信:文本样式是根据所使用的图案字母数确定的。少于4个图案字母将使用缩写形式。正好有4个图案字母将使用完整的形式。正好有5个图案字母将使用窄格式。图案字母“L”、“c”和“q”指定文本样式的独立形式。
数:如果字母计数为 1,则使用最小位数输出该值,并且不进行填充。否则,数字计数将用作输出字段的宽度,并根据需要填充值零。以下模式字母对字母计数有约束。只能指定一个字母“c”和“F”。最多可以指定两个字母:“d”、“H”、“h”、“K”、“k”、“m”和“s”。最多可以指定三个字母“D”。
数字/文本:如果图案字母的计数为 3 或更大,请使用上面的文本规则。否则,请使用上面的数字规则。
更新
我向 Oracle 提交了两份文件:
- 请求修复LLL(长格式文本)问题的错误:JDK-8114833(原始预言机评论ID:JI-9021661)
- 请求增强小写月份解析问题:查看 ID:0(这也是一个错误吗??)