Java SimpleDateFormat 返回不正确的日期[重复]

问题描述 投票:0回答:2

我在 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)

输出已更新。谢谢你指出来

java simpledateformat
2个回答
3
投票

你的代码有很多问题:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
dateFormat.parse(20000611);   
dateFormat.parse(2000-06-11;)
  1. SimpleDateFormat
    期待
    parse
    中的字符串,而你的都不是字符串。
  2. 分号表示语句结束,而你在最后一行写错了
  3. 即使你传递的是字符串,第一次解析的值也不会给你 May 11。它应该是 June

假设您要为最后一行传递一个字符串 (

"2000-06-11"
)。该格式与您用于创建
dateFormat
的格式不匹配,您应该如何解析它?虽然我可以编一些解释来告诉你为什么会产生那个结果,但这根本不是使用
SimpleDateFormat
.

的方式

可能发生的情况是,日期格式将

2000
作为
yyyy
-0
作为
MM
,以及
6-
作为
dd
,并忽略
11


3
投票

tl;博士

LocalDate.parse( "2000-06-11" )
LocalDate.parse( "20000611" , DateTimeFormatter.BASIC_ISO_DATE ) 

避免遗留日期时间类

Shum回答是正确的。但是答案和问题都使用了有严重缺陷的日期时间类,这些类现在已经遗留,多年前被 JSR 310 中定义的现代 java.time 类所取代。

此外,您的输入表示仅日期值,没有时间,没有时区或与 UTC 的偏移量。遗留类不能表示仅限日期的值。

java.time

您的输入字符串采用扩展 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 格式的扩展版本。在我的经验中更常见。并且更容易被人类阅读。

© www.soinside.com 2019 - 2024. All rights reserved.