Ais*_*rma 7 java time date iso8601 datetime-format
我正在使用 java 11。想知道验证日期时间字符串是否符合 java 中的 ISO8601 要求的最佳(最重要的是推荐)方法是什么。
另外如何将此字符串值与 java.sql.Timestamp 进行比较?
ISO 8601涉及的内容太多,因此我不会写出详尽的答案。我试图概述您可能会选择的选项。之后你应该进一步研究相关的。也许在这样做之前,您需要研究一下 ISO 8601 是什么、它有时可能是什么以及它是什么\xe2\x80\x99t。
\n对于许多(大多数)目的,尝试使用 java.time(现代 Java 日期和时间 API)的内置方法来解析字符串,将为您提供令人满意的验证,正如其他答案中已经所述的那样。选项有:
\nparsejava.time 中相应日期时间类的 one-arg 方法。它们通常解析 ISO 8601 格式,DateTimeParseException如果字符串不是 ISO 8601 格式,则抛出 a 。根据字符串中需要显示的信息(日期和/或时间、UTC 偏移量),您可以使用OffsetDateTime.parse()或 等LocalDate.parse()。ISO_XXXX的常量之一DateTimeFormatter。至少在三种情况下,上述内容可能对您来说还不够:
\nOffsetDateTime.parse(CharSequence)需要在距 UTC 的偏移量中使用冒号(如果不是Z),如 中所示+07:00。ISO 8601 还允许在不使用冒号的情况下写入偏移量,如 中所示+0700。如果您需要适应内置方法未涵盖的变体,那么构建您自己的DateTimeFormatter可能是一个很好且不太复杂的解决方案。您可以使用该DateTimeForamtter.ofPattern方法或DateTimeFormatterBuilder.isBefore和isAfter。如果您可以避免使用java.sql.Timestamp,请避免使用。该类设计不佳且早已过时。从JDBC 4.2OffsetDateTime开始,我们更喜欢LocalDateTime从SQL数据库中获取时间戳。
如果您从旧 API 中获得了 a Timestamp,而您现在无法承担升级费用,请将每个转换为 anInstant并使用isBefore()或来比较它们isAfter()。这里\xe2\x80\x99s 是一个例子:
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);\nRun Code Online (Sandbox Code Playgroud)\n该示例的输出是:
\n\n\nISO 8601 字符串是否位于时间戳之前?错误的
\n