我对以下行为感到很困惑。我从一个方法返回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。
与往常一样,可能有一种更简单的方法来实现我的目标。
答案 0 :(得分:2)
您正在使用格式模式字符串yyyyMMdd
。您正在解析日期时间字符串2018-06-20 00:00:00
。
2018
匹配yyyy
。 MM
表示月份应该是两个字符,因此本月会采用-0
。并且-0
或仅0被视为2018年第1个月之前的月份,也就是2017年12月。最后6
被视为月中的某一天。它应该是两个字符,但由于只有一个数字,SimpleDateFormat
与此结算。字符串的其余部分被默认忽略。
解析另一个字符串时,完全相同。
简而言之,这是一个长期过时的SimpleDateFormat
课程:在尝试友好和乐于助人的过程中,它产生了最令人不快和令人困惑的惊喜。你希望它会告诉你什么是错的,它只是假装一切都很好。这是这个类被认为是麻烦的主要原因之一,以及为什么4年前用Java 8替换旧类。所以永远不要再使用SimpleDateFormat
。
而是查看java.time
及其DateTimeFormatter
。
也不要将日期值作为数据库中的字符串。根据查询返回的数据类型,可以获得LocalDateTime
或LocalDate
对象。这将使您完全免于解析。
链接: Oracle tutorial: Date Time解释如何使用java.time
。
答案 1 :(得分:0)
好像你的模式与你传递的stringDates不匹配。 尝试使用:
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");