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

时间:2018-05-24 15:31:23

标签: java datetime simpledateformat java-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。

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

enter image description here

2 个答案:

答案 0 :(得分:2)

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

2018匹配yyyyMM表示月份应该是两个字符,因此本月会采用-0。并且-0或仅0被视为2018年第1个月之前的月份,也就是2017年12月。最后6被视为月中的某一天。它应该是两个字符,但由于只有一个数字,SimpleDateFormat与此结算。字符串的其余部分被默认忽略。

解析另一个字符串时,完全相同。

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

而是查看java.time及其DateTimeFormatter

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

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

答案 1 :(得分:0)

好像你的模式与你传递的stringDates不匹配。 尝试使用:

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