在将 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]

提问人:Karthik CM 提问时间:10/13/2023 最后编辑:Federico klez CullocaKarthik CM 更新时间:10/26/2023 访问量:75

问:

为什么 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-ddyyyyMMdd

Java 日期 解析

评论

4赞 Federico klez Culloca 10/13/2023
parse 方法的文档没有说它会在不遵循所提供格式的字符串上引发异常。即使正因为如此,您也应该使用较新的时间 API。请看这里
0赞 10/13/2023
您可以通过禁用宽松的解析来使 DateFormatter 更加严格 - 但是,可能还有很多其他情况,旧的 Date 类无法按照您希望的方式工作,正如已经说过的,最好的解决方案是切换到更新的 java.time API。sdf.setLenient(false);
3赞 Anonymous 10/13/2023
如果您好奇:以 2023 年为年,-0 为月,1 为月中的某一天。没有月份 0(-0 等于 0)不会打扰它。然后它忽略了尾随的 -01。确实很混乱。我同意:不要使用那个类。 从来没有。SimpleDateFormat

答:

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我不明白你的意思。我的方法的输入有什么区别? 也内置了: .yyyyMMddLocalDate.parse("20230101", DateTimeFormatter.BASIC_ISO_DATE)
1赞 Anonymous 10/13/2023
如果您要获取格式模式字符串和日期字符串,并且想要检测它们不匹配的事实: 将抛出一个信号,表示无法使用该格式解析字符串。yyyyMMdd2023-01-01LocalDate.parse("2023-01-01", DateTimeFormatter.ofPattern("yyyyMMdd"))DateTimeParseException