在java中验证ISO8601日期时间字符串的推荐方法是什么

Ais*_*rma 7 java time date iso8601 datetime-format

我正在使用 java 11。想知道验证日期时间字符串是否符合 java 中的 ISO8601 要求的最佳(最重要的是推荐)方法是什么。

另外如何将此字符串值与 java.sql.Timestamp 进行比较?

Ole*_*.V. 6

ISO 8601涉及的内容太多,因此我不会写出详尽的答案。我试图概述您可能会选择的选项。之后你应该进一步研究相关的。也许在这样做之前,您需要研究一下 ISO 8601 是什么、它有时可能是什么以及它是什么\xe2\x80\x99t。

\n

对于许多(大多数)目的,尝试使用 java.time(现代 Java 日期和时间 API)的内置方法来解析字符串,将为您提供令人满意的验证,正如其他答案中已经所述的那样。选项有:

\n
    \n
  • 更简单且最常见的是:使用parsejava.time 中相应日期时间类的 one-arg 方法。它们通常解析 ISO 8601 格式,DateTimeParseException如果字符串不是 ISO 8601 格式,则抛出 a 。根据字符串中需要显示的信息(日期和/或时间、UTC 偏移量),您可以使用OffsetDateTime.parse()或 等LocalDate.parse()
  • \n
  • 对于特殊或外来的需要,请使用该类ISO_XXXX的常量之一DateTimeFormatter
  • \n
\n

至少在三种情况下,上述内容可能对您来说还不够:

\n
    \n
  1. 内置意味着所提到的解析并接受最常见的ISO 8601 变体。例如,OffsetDateTime.parse(CharSequence)需要在距 UTC 的偏移量中使用冒号(如果不是Z),如 中所示+07:00。ISO 8601 还允许在不使用冒号的情况下写入偏移量,如 中所示+0700。如果您需要适应内置方法未涵盖的变体,那么构建您自己的DateTimeFormatter可能是一个很好且不太复杂的解决方案。您可以使用该DateTimeForamtter.ofPattern方法或DateTimeFormatterBuilder.
  2. \n
  3. 内置方法有时会允许您可能不希望允许的值。例如,在严格的 ISO 8601 中,一年介于 1583 和 9999 之间(包括 1583 和 9999)。java.time 的类允许从 -999 999 999 到 +999 999 999 的年份。您的解决方案是解析后进行范围检查。日期时间类具有用于此目的的方法isBeforeisAfter
  4. \n
  5. ISO 8601 包括java.time 不提供类或格式化程序的时间间隔,包括重复时间间隔。如果您想允许这些,您可以寻找不同的日期和时间库(例如 Time4J 和 ThreeTen Extra),或者您将必须自己做更多的工作来验证。
  6. \n
\n

如何与 java.sql.Timestamp 进行比较?

\n

如果您可以避免使用java.sql.Timestamp,请避免使用。该类设计不佳且早已过时。从JDBC 4.2OffsetDateTime开始,我们更喜欢LocalDateTimeSQL数据库中获取时间戳。

\n

如果您从旧 API 中获得了 a Timestamp,而您现在无法承担升级费用,请将每个转换为 anInstant并使用isBefore()或来比较它们isAfter()。这里\xe2\x80\x99s 是一个例子:

\n
    String yourIso8601String = "2020-11-17T02:51:39.375109+07:00";\n    Timestamp ts = Timestamp.from(Instant.parse("2020-11-16T19:00:00Z"));\n    \n    OffsetDateTime odt = OffsetDateTime.parse(yourIso8601String);\n    boolean isBeforeTimestamp = odt.toInstant().isBefore(ts.toInstant());\n    System.out.println("Is the ISO 8601 string before the Timestamp? " + isBeforeTimestamp);\n
Run Code Online (Sandbox Code Playgroud)\n

该示例的输出是:

\n
\n

ISO 8601 字符串是否位于时间戳之前?错误的

\n
\n

链接

\n\n