【问题标题】:Converting String to Date using SimpleDateFormat is returning random date [duplicate]使用 SimpleDateFormat 将字符串转换为日期返回随机日期 [重复]
【发布时间】:2018-11-03 21:43:16
【问题描述】:

我对以下行为感到非常困惑。我从一个方法返回 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 方法的值。

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

【问题讨论】:

  • Date 对象没有格式 - 您看到的只是在对象上调用 toString() 的结果。
  • 解析格式为“yyyy-MM-dd”的字符串“2018-06-20”,并格式化格式为“yyyyMMdd”的日期2018-06-20以接收“20180620”。格式始终与字符串有关。
  • 粘贴文本,而不是文本图像。

标签: java datetime simpledateformat date


【解决方案1】:

您正在使用格式模式字符串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

【讨论】:

    【解决方案2】:

    似乎您的模式与您传递的 stringDates 不匹配。 尝试使用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多