我有一个字符串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