我在 Java 中处理一些日期。尝试将一些字符串日期输入解析为 Date 对象。 这是使用 SimpleDateFormat.parse(String date) 完成的。
当我使用“yyyyMMdd”的 SimpleDateFormat 时,我希望它只解析以这种格式给出的字符串日期,并给出所有其他格式的错误。例如,它应该将 20000611 解析为 2000 年 6 月 6 日。但是当给出格式为 2000-06-11 的字符串时,它不应该能够解析(并因此抛出 ParseException)。
然而,事实并非如此,它解析了这个日期并且这样做是错误的。 想知道我是否可以做些什么来解决这个问题,或者这是否是我的错误。我希望它不会用破折号解析日期。任何帮助将不胜感激:)
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
dateFormat.parse("20000611");
dateFormat.parse("2000-06-11");
输出如下:
Thu June 11 00:00:00 NDT 2000 (correct)
Sun Dec 05 00:00:00 NST 1999 (incorrect)
输出已更新。谢谢你指出来
你的代码有很多问题:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
dateFormat.parse(20000611);
dateFormat.parse(2000-06-11;)
SimpleDateFormat
期待parse
中的字符串,而你的都不是字符串。假设您要为最后一行传递一个字符串 (
"2000-06-11"
)。该格式与您用于创建 dateFormat
的格式不匹配,您应该如何解析它?虽然我可以编一些解释来告诉你为什么会产生那个结果,但这根本不是使用SimpleDateFormat
.的方式
可能发生的情况是,日期格式将
2000
作为yyyy
,-0
作为MM
,以及6-
作为dd
,并忽略11
。
LocalDate.parse( "2000-06-11" )
LocalDate.parse( "20000611" , DateTimeFormatter.BASIC_ISO_DATE )
Shum的回答是正确的。但是答案和问题都使用了有严重缺陷的日期时间类,这些类现在已经遗留,多年前被 JSR 310 中定义的现代 java.time 类所取代。
此外,您的输入表示仅日期值,没有时间,没有时区或与 UTC 的偏移量。遗留类不能表示仅限日期的值。
您的输入字符串采用扩展 YYYY-MM-DD 和“基本”版本 YYYYMMDD 的标准 ISO 8601 格式。
解析/生成文本时默认使用扩展版本
LocalDate ld = LocalDate.parse( "2000-06-11" ) ;
“基本”版本是在名为
DateTimeFormatter
的
BASIC_ISO_DATE
常量对象中预定义的。
LocalDate ld = LocalDate.parse( "20000611" , DateTimeFormatter.BASIC_ISO_DATE ) ;
提示:坚持使用 ISO 8601 格式的扩展版本。在我的经验中更常见。并且更容易被人类阅读。