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

4smxwvx5  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(513)

我正在使用Java11。想知道在java中验证datetime字符串是否为iso8601的最佳(最重要的推荐)方法是什么。
另外,如何将这个字符串值与java.sql.timestamp进行比较?

qmb5sa22

qmb5sa221#

假设您至少使用java 8,最简单的方法是这样:

private static boolean isIsoDate(String date) {
    try {
        Instant.from(DateTimeFormatter.ISO_INSTANT.parse(date));
        return true;
    } catch (DateTimeParseException e) {
        //log the failure here
        e.printStackTrace();
    }
    return false;
}

相反,您可以使用 regex 但这比上面提到的方法要困难得多。
至于您的另一个问题,最简单的方法是首先将日期字符串转换为具体的字符串 Date 对象,然后按照此处的建议操作:
在java中比较日期对象和时间戳

vnjpjtjt

vnjpjtjt2#

稍后您可以使用 DateTimeFormatter 类来检查格式,因此我定义了一个方法来检查其是否为iso格式:

boolean isValidISODateTime(String date) {
    try {
        java.time.format.DateTimeFormatter.ISO_DATE_TIME.parse(date);
        return true;
    } catch (java.time.format.DateTimeParseException e) {
        return false;
    }
}
5uzkadbs

5uzkadbs3#

ISO8601是这么多的东西,所以我不打算写一个详尽的答案。我试着给一个选项,你可能会选择概述。之后你应该进一步研究相关的问题。也许在这样做之前,你需要研究一下什么是ISO8601,它有时是什么,有时不是什么。
对于许多(大多数)目的来说,尝试使用java.time(现代java日期和时间api)的内置方法来解析字符串将给您带来令人满意的验证,如其他答案中所述。选项包括:
更简单,也更经常:使用一个参数 parse java.time中相应日期时间类的方法。它们通常解析iso8601格式并抛出 DateTimeParseException 如果字符串不是iso 8601格式。根据字符串中所需的信息(日期和/或时间,utc偏移量),您可以使用 OffsetDateTime.parse() 或者 LocalDate.parse() .
对于特殊或异国情调的需要使用 ISO_XXXX 常数 DateTimeFormatter 班级。
至少有三种方法可能不足以满足您的要求:
Build it means解析并接受最常见的ISO8601变体。例如, OffsetDateTime.parse(CharSequence) 需要在与utc的偏移量中使用冒号(如果不是 Z ),如 +07:00 . iso8601还允许在不使用冒号的情况下写入偏移量,如 +0700 . 如果您需要适应内置方法未涵盖的变体,请自行构建 DateTimeFormatter 可能是一个好的且不太复杂的解决方案。你可以用 DateTimeForamtter.ofPattern 方法或方法 DateTimeFormatterBuilder .
内置的方法有时允许您不希望允许的值。例如,在严格的ISO8601标准中,一年是1583到9999之间(包括1583和9999)。java.time的类允许从-999到+999年。您的解决方案是在解析之后进行范围检查。日期时间类有方法 isBefore 以及 isAfter 为了这个。
iso8601包括java.time不提供类或格式化程序的时间间隔,包括重复的时间间隔。如果你想允许这些,你可以寻找一个不同的日期和时间库(想到time4j和threetenextra),或者你必须自己做更多的工作来验证。

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

如果你能避免使用 java.sql.Timestamp ,做。那门课设计得很差,而且已经过时很久了。由于JDBC4.2,我们更喜欢将时间戳作为 OffsetDateTime 或者 LocalDateTime 从我们的sql数据库。
如果你有 Timestamp 从您现在无法升级的遗留api,将每个api转换为 Instant 并使用 isBefore() 或者 isAfter() . 举个例子:

String yourIso8601String = "2020-11-17T02:51:39.375109+07:00";
    Timestamp ts = Timestamp.from(Instant.parse("2020-11-16T19:00:00Z"));

    OffsetDateTime odt = OffsetDateTime.parse(yourIso8601String);
    boolean isBeforeTimestamp = odt.toInstant().isBefore(ts.toInstant());
    System.out.println("Is the ISO 8601 string before the Timestamp? " + isBeforeTimestamp);

示例的输出为:
iso 8601字符串是否在时间戳之前?假

链接

维基百科文章:iso 8601
oracle教程:date time解释如何使用java.time。
time4j-java的高级日期、时间、区域和间隔库
额外的310

相关问题