我正在使用Java11。想知道在java中验证datetime字符串是否为iso8601的最佳(最重要的推荐)方法是什么。另外,如何将这个字符串值与java.sql.timestamp进行比较?
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中比较日期对象和时间戳
regex
Date
vnjpjtjt2#
稍后您可以使用 DateTimeFormatter 类来检查格式,因此我定义了一个方法来检查其是否为iso格式:
DateTimeFormatter
boolean isValidISODateTime(String date) { try { java.time.format.DateTimeFormatter.ISO_DATE_TIME.parse(date); return true; } catch (java.time.format.DateTimeParseException e) { return false; } }
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),或者你必须自己做更多的工作来验证。
parse
DateTimeParseException
OffsetDateTime.parse()
LocalDate.parse()
ISO_XXXX
OffsetDateTime.parse(CharSequence)
Z
+07:00
+0700
DateTimeForamtter.ofPattern
DateTimeFormatterBuilder
isBefore
isAfter
如果你能避免使用 java.sql.Timestamp ,做。那门课设计得很差,而且已经过时很久了。由于JDBC4.2,我们更喜欢将时间戳作为 OffsetDateTime 或者 LocalDateTime 从我们的sql数据库。如果你有 Timestamp 从您现在无法升级的遗留api,将每个api转换为 Instant 并使用 isBefore() 或者 isAfter() . 举个例子:
java.sql.Timestamp
OffsetDateTime
LocalDateTime
Timestamp
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 8601oracle教程:date time解释如何使用java.time。time4j-java的高级日期、时间、区域和间隔库额外的310
3条答案
按热度按时间qmb5sa221#
假设您至少使用java 8,最简单的方法是这样:
相反,您可以使用
regex
但这比上面提到的方法要困难得多。至于您的另一个问题,最简单的方法是首先将日期字符串转换为具体的字符串
Date
对象,然后按照此处的建议操作:在java中比较日期对象和时间戳
vnjpjtjt2#
稍后您可以使用
DateTimeFormatter
类来检查格式,因此我定义了一个方法来检查其是否为iso格式: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()
. 举个例子:示例的输出为:
iso 8601字符串是否在时间戳之前?假
链接
维基百科文章:iso 8601
oracle教程:date time解释如何使用java.time。
time4j-java的高级日期、时间、区域和间隔库
额外的310