在Java中如何检查字符串(持有日期时间值)是否根据日期时间格式YYYYMMDDTHHMMSSZ &



我有一个字符串billedDate,它存储来自输入的日期时间值。我需要检查它是否有效,并且根据日期时间格式YYYYMMDDTHHMMSSZ是否有任何功能我可以使用?对于十进制字段,我使用NumberUtils。isParsable为字段返回true或false。

使用java.time.format.DateTimeFormatter解析字符串。捕获解析异常并将其作为否定响应处理。

注:没有很好的理由使用SimpleDateFormat, java.util.Date或java.util.Calendar当java.time。*存在,所以请不要。

java.time

我推荐java。time,现代Java日期和时间API,用于您的日期和时间工作。我建议:

private static final DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("uuuuMMdd'T'HHmmssX")
.withResolverStyle(ResolverStyle.STRICT);
public static boolean isParseableBasicIso8601(String str) {
try {
OffsetDateTime odt = OffsetDateTime.parse(str, formatter);
return odt.getOffset().equals(ZoneOffset.UTC);
} catch (DateTimeParseException dtpe) {
return false;
}
}

试一试:

String[] testStrings = {
"20210223T234556Z",
"Cannot be parsed",
"20210229T234556Z",
"20210223T234556+08",
"20210223T234556+00",
};

for (String s : testStrings) {
System.out.format("%-18s? %s%n", s, isParseableBasicIso8601(s));
}

输出是:

20210223T234556Z  ? true
Cannot be parsed  ? false
20210229T234556Z  ? false
20210223T234556+08? false
20210223T234556+00? true

第三个例子表明Java知道2021不是闰年。ResolverStyle.STRICT导致2月29日拒收。在第四个例子中,UTC偏移量是错误的。接受最后一个例子并不是你想要的。在ISO 8601格式(你的格式)中,与UTC的零偏移量通常表示为Z,但+00也被接受。如果你想拒绝这一点,解决方案是在Mad Programmer的评论中:使用相同的格式化器格式化日期时间,并且只接受两个字符串相等的情况。

考虑添加一个范围检查和拒绝日期和时间,这些日期和时间在过去或未来都是不合理的。使用OffsetDateTime.isBefore()isAfter()进行比较。

链接
  • Oracle教程:日期时间说明如何使用java.time.
  • 维基百科条目:ISO 8601

解决方案似乎是使用java的SimpleDateFormat

SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'");
Date parsed = format.parse("11111111T111111Z");

我还建议改用ISO日期格式。它就像你建议的格式,但是有一些额外的间隔符,使它更适合未来和人类可读。

Yours: yyyyMMdd'T'HHmmss'Z'
ISO:  yyyy-MM-dd'T'HH:mm'Z'

参考:https://stackoverflow.com/a/3914498/5987669

相关内容

  • 没有找到相关文章

最新更新