使用 SimpleDateFormat 将字符串转换为日期返回随机日期

Converting String to Date using SimpleDateFormat is returning random date

我对以下行为感到很困惑。我从方法中返回 2 个日期作为字符串:

 getLastSupplierFlightResults()

我添加了一个屏幕截图,显示返回日期分别为“2018-06-20 00:00:00”和“2018-06-24 00:00:00”,并留下调试跟踪以显示值。

我只想将日期转换为 20180620 格式。

方法:

.withStartDate()
.withEndDate()

...接受字符串值

我不明白的是 "Wed Dec 06 00:00:00 GMT 2017" 日期是从哪里来的?这是最终作为 20171206 传递给 .withStart 和 .withEnd 方法的值。

一如既往,可能有更简单的方法来实现我的目标。

您的模式似乎与您传递的 stringDates 不匹配。 尝试使用:

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

您正在使用格式模式字符串 yyyyMMdd。您正在解析日期时间字符串 2018-06-20 00:00:00.

2018 匹配 yyyyMM 表示月份应该是两个字符,因此 -0 代表月份。并且-0或者只是0被取为2018年1月的前一个月,也就是2017年12月。最后6被取为月中的第几天。它也应该是两个字符,但由于只有一个数字,因此 SimpleDateFormat 就这样解决了。字符串的其余部分被默认忽略。

解析另一个字符串时会发生完全相同的事情。

它是早已过时的 SimpleDateFormat class 简而言之:在它试图变得友好和乐于助人的过程中,它产生了最不愉快和最令人困惑的惊喜。在您希望它告诉您出了什么问题的地方,它只是假装一切都很好。这是 class 被认为是麻烦的主要原因之一,也是为什么旧 classes 的替代品在 4 年多前就出现了 Java 8。所以永远不要再使用 SimpleDateFormat

而是查看 java.time 及其 DateTimeFormatter

也不要从数据库中获取日期值作为字符串。根据查询 returns 获得 LocalDateTimeLocalDate 对象的数据类型。这将使您完全摆脱解析。

Link: Oracle tutorial: Date Time 解释如何使用 java.time.