我对以下行为感到非常困惑。我从方法中以字符串形式返回 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 方法中的值。
一如既往,可能有一种更简单的方法来实现我的目标。
最佳答案
您正在使用格式模式字符串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
。
关于java - 使用 SimpleDateFormat 将字符串转换为日期会返回随机日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50513135/