提问人:Karthik CM 提问时间:10/13/2023 最后编辑:Federico klez CullocaKarthik CM 更新时间:10/26/2023 访问量:75
在将 JAVA-8 中的日期解析为特定格式期间。source(yyyy-MM-dd) 和 destination(yyyyMMdd) 格式与 [duplicate] 不匹配时未显示错误
During date parsing in JAVA-8 to specific format. Error is not showing for source(yyyy-MM-dd) and destination(yyyyMMdd) format not matching [duplicate]
问:
为什么 2023-01-01 被接受为 yyyyMMdd 格式?
public static void main(String[] args) throws ParseException {
String s = "2023-01-01";
DateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.parse(s);
}
如果提供的格式: -->按预期工作(抛出异常)yyyy/MM/dd
如果提供的格式: ---> 未按预期工作 ( 不抛出异常 )yyy-MM-dd
我可以通过考虑字符串的长度来处理这个问题。这里的问题是为什么格式被成功解析?yyyy-MM-dd
yyyyMMdd
答:
2赞
Basil Bourque
10/13/2023
#1
LocalDate.parse( "2023-01-01" )
有争议的问题。您正在使用有严重缺陷的日期时间类。这些类在几年前被 JSR 310 中定义的现代 java.time 类完全取代。努力理解那些遗留类是没有意义的,比如 .Sun、Oracle 和 JCP 社区都放弃了那些失败的课程,你也应该放弃。SimpleDateFormat
👉🏽 使用 java.time 非常简单:
String s = "2023-01-01";
LocalDate ld = LocalDate.parse( s );
无需指定格式模式。默认情况下,java.time 类使用扩展的 ISO 8601 格式。
如果输入文本是 ISO 8601 的紧凑“基本”变体,请使用提供的格式化程序对象。
LocalDate ld = LocalDate.parse( "20230101", DateTimeFormatter.BASIC_ISO_DATE ) ;
要检测意外或错误的输入,请为 的 trap 。DateTimeParseException
评论
0赞
Karthik CM
10/13/2023
在这里,我的方法的输入将采用 yyyyMMdd 格式。为此,如果我提供像 yyyy-MM-dd 这样的值,它就会被解析。理想情况下,它不应该是正确的
1赞
Anonymous
10/13/2023
@KarthikCM我不明白你的意思。我的方法的输入和值有什么区别? 也内置了: .yyyyMMdd
LocalDate.parse("20230101", DateTimeFormatter.BASIC_ISO_DATE)
1赞
Anonymous
10/13/2023
如果您要获取格式模式字符串和日期字符串,并且想要检测它们不匹配的事实: 将抛出一个信号,表示无法使用该格式解析字符串。yyyyMMdd
2023-01-01
LocalDate.parse("2023-01-01", DateTimeFormatter.ofPattern("yyyyMMdd"))
DateTimeParseException
评论
parse
方法的文档没有说它会在不遵循所提供格式的字符串上引发异常。即使正因为如此,您也应该使用较新的时间 API。请看这里。sdf.setLenient(false);
SimpleDateFormat