我对以下行为感到非常困惑。我从一个方法返回 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
again.
相反,看看java.time
和它的DateTimeFormatter
.
也不要从数据库中获取字符串形式的日期值。根据查询返回的数据类型,可以得到LocalDateTime
or a LocalDate
目的。这将使您完全摆脱解析。
Link: Oracle 教程:日期时间解释如何使用java.time
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)