使用SimpleDateFormat将String转换为Date返回随机日期

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

getLastSupplierFlightResults() 

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

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

方法:

 .withStartDate() .withEndDate() 

…接受字符串值

我不明白的是“2017年12月6日00:00:00 GMT”的日期是从哪里来的? 这是最终被传递到.withStart和.withEnd方法的值,如20171206。

与往常一样,可能有一种更简单的方法来实现我的目标。

在此处输入图像描述

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

2018yyyy相匹配。 MM表示月份应该是两个字符,因此本月采用-0 。 并且-0或0仅被视为2018年第1个月的月份,即2017年12月。最后6被视为月份的日期。 它本来应该是两个字符,但由于只有一个数字, SimpleDateFormat解决这个问题。 字符串的其余部分被默认忽略。

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

简而言之,这是漫长的过时的SimpleDateFormat类:在它的友好和乐于助人的尝试中,它产生了最令人不快和令人困惑的惊喜。 你希望它会告诉你什么是错的,它只是假装一切都很好。 这是这个类被认为是麻烦的主要原因之一,以及为什么在4年前用Java 8替换旧类。 因此,再也不要使用SimpleDateFormat

而是查看java.time及其DateTimeFormatter

也不要将日期值作为数据库中的字符串。 根据查询返回的数据类型,可以获取LocalDateTimeLocalDate对象。 这将使您完全免于解析。

链接: Oracle教程:Date Time解释如何使用java.time

看起来你的模式与你传递的stringDates不匹配。 尝试使用:

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