java - 使用 SimpleDateFormat 将字符串转换为日期会返回随机日期

标签 java datetime simpledateformat date

我对以下行为感到非常困惑。我从方法中以字符串形式返回 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 方法中的值。

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

enter image description here

最佳答案

您正在使用格式模式字符串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 tutorial: Date Time解释如何使用java.time

关于java - 使用 SimpleDateFormat 将字符串转换为日期会返回随机日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50513135/

相关文章:

java - 如何在 CentOs 6 上以非 root 用户身份运行 java 服务

java - 类似于 yourkit 的工具?

java - 可以在 Play 2 框架中使用 Java NIO 同时发布和获取文件吗?

javascript - 使用默认的 JavaScriptSerializer 将 DateTime 绑定(bind)到挖空 View 模型

自定义异常的 Java 解析异常

java - 测试时间格式 HH :MM:SS. sss

java - 无法从 Eclipse 查看 Tomcat 启动期间抛出的异常

PHP Carbon diffInMonths

python - 如何按定义的时间间隔对 Pandas 数据框进行分组?

java - 这是什么日期格式? 2011-08-12T20 :17:46. 384Z