【问题标题】:How to format any kind format of Date or DateTime String to one exact format date string in Java? [duplicate]如何在 Java 中将任何类型的日期或日期时间字符串格式格式化为一种精确的格式日期字符串? [复制]
【发布时间】:2022-01-09 15:39:17
【问题描述】:

我在数据库中有几个不同格式的日期数据,如下所示:

When
---
2021-11-20
2021-11-20 05:03:31
2021-11-20 04:19:25.4
19-11-2021 19:11
19/11/2021 17.39
19 November'21 16:00
19-November-2021
19/11/2021
19-Nov-2021

现在我想一次性将它们更改为dd-mm-yyyy 的格式,以便它们可以在 Java 中统一。我之前在堆栈溢出中找到了一些答案,例如SimpleDateTimeDateTimeFormatter 的使用,但日期时间格式似乎只有一种,他们想更改为一种特定的日期时间形式,但就我而言,日期时间形式看起来很随意。任何想法将不胜感激。提前致谢。

附:我想清理用户即将到来的输入,因为它具有“何时”的输入字段,但填充格式仍然取决于用户选择他们喜欢的格式。这肯定不是一个好的做法,但是更改这个基本且最可能使用的方法会导致这种不必要的冲突。

【问题讨论】:

  • 您可能会尝试按顺序解析格式并在匹配时获取值,但除非传入的格式是众所周知且明确的,否则它将始终是一个脆弱的过程。
  • 这些示例在您的数据库中有哪些类型?可能是在数据库/查询级别对它们进行规范化的选项。
  • 您指定的格式是多种多样的,所以不要认为有任何开箱即用的方法来解析它们。可能您必须创建一个小实用程序,您可以在列表中保存不同的模式,然后对于从 DB 收到的每个日期,您必须将其与每种定义的格式进行匹配。
  • 既然你提到SimpleDateTimeDateTimeFormatter:永远不要使用SimpleDateFormat。它是一个臭名昭著的麻烦制造者,而且早已过时。始终使用DateTimeFormatter。在链接的原始问题中,您会找到两者的示例,因此请明智地过滤。
  • 遇到02/11/2021时,真正的问题来了。那么您将不知道是 2 月 11 日还是 11 月 2 日。

标签: java spring-boot datetime


【解决方案1】:

我建议使用模式创建一个自定义格式化程序并使用它。比如:

public static final MY_DATE_TIME_PARSER = new DateTimeFormatterBuilder()
      .appendPattern("yyyy-MM-dd[['T']HH[[':']mm[[':'][ss['.'[SSS][SS][S]]]['Z']]]]").parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
      .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0).parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
      .parseDefaulting(ChronoField.NANO_OF_SECOND, 0).toFormatter();

然后将其用作:

String string = "2021-01-01T10:20:30.Z";
LocalDateTime localDateTime = LocalDateTime.parse(string,  MY_DATE_TIME_PARSER);

尝试使用不同的输入对其进行测试,看看它是否能解决您的目的。

【讨论】:

  • 我认为它只处理问题中九个示例中的第一个。 OP 可能可以对其进行修改以至少处理更多。
  • 对。我只是建议了一个创建灵活格式化程序的示例。
猜你喜欢
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 2020-08-07
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
相关资源
最近更新 更多