我将验证一个简单的时间日期格式(yyyy-MM-dd'T'HH:mm:ss
),如下所示。这个实现适用于大多数主要验证,但不知何故,我发现一些验证似乎并没有起作用。
例如,如果您输入2014-09-11T03:27:54kanmsdklnasd
,2014-09-11T03:27:54234243
,则无法验证。你能指出我的代码错误吗?
码
String timestamp = "2014-09-11T03:27:54";
SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
try{
format.parse(timestamp);
LOG.info("Timestamp is a valid format");
}
catch(ParseException e)
{
return ssoResponse;
}
答案 0 :(得分:4)
SimpleDateFormat.parse()
(来自DateFormat.parse()
)不能用于全字符串验证,因为引用了javadoc:
方法可能不会使用给定字符串的整个文本。
相反,您可以使用DateFormat.parse(String source, ParsePosition pos)
进行验证。
你通过的ParsePosition
是"进出"参数,您可以在调用parse()
方法后获取信息:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
// If you set lenient to false, ranges will be checked, e.g.
// seconds must be in the range of 0..59 inclusive.
format.setLenient(false);
String timestamp = "2014-09-11T03:27:54";
ParsePosition pos = new ParsePosition(0);
format.parse(timestamp, pos); // No declared exception, no need try-catch
if (pos.getErrorIndex() >= 0) {
System.out.println("Input timestamp is invalid!");
} else if (pos.getIndex() != timestamp.length()) {
System.out.println("Date parsed but not all input characters used!"
+ " Decide if it's good or bad for you!");
} else {
System.out.println("Input is valid, parsed completely.");
}
答案 1 :(得分:1)
使用JodaTime非常容易。
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
//from your method
String inputDateString = "2014-09-11T03:27:54kanmsdklnasd";
String pattern = "yyyy-MM-dd'T'HH:mm:ssZ";
boolean isValid = isValidDateFormat(inputDateString, pattern);
private boolean isValidDateFormat(String inputDateString, String format){
try {
DateTimeFormatter dtf = DateTimeFormat.forPattern(format);
dtf.parseDateTime(inputDateString);
} catch (Exception ex) {
return false;
}
return true;
}
You will get..
*Exception in thread "main" java.lang.IllegalArgumentException:
Invalid format: "2014-09-11T03:27:54kanmsdklnasd" is malformed at "kanmsdklnasd"*
答案 2 :(得分:1)
旧的日期时间 API(java.util
日期时间类型及其格式 API,SimpleDateFormat
)已经过时且容易出错。建议完全停止使用,改用java.time
,modern date-time API*。
另外,请查看 Home Page of Joda-Time
上的以下通知 <块引用>Joda-Time 是 Java 的事实上的标准日期和时间库 在 Java SE 8 之前。现在要求用户迁移到 java.time (JSR-310)。
使用现代日期时间 API 的演示:
import java.time.LocalDateTime;
import java.time.format.DateTimeParseException;
import java.util.stream.Stream;
public class Main {
public static void main(String args[]) {
Stream.of(
"2014-09-11T03:27:54",
"2014-09-11T03:27:54kanmsdklnasd",
"2014-09-11T03:27:54234243"
).forEach(s -> {
try {
System.out.println(LocalDateTime.parse(s));
}catch(DateTimeParseException e) {
System.out.printf("The date-time string, \"%s\" is not valid.%n", s);
}
});;
}
}
输出:
2014-09-11T03:27:54
The date-time string, "2014-09-11T03:27:54kanmsdklnasd" is not valid.
The date-time string, "2014-09-11T03:27:54234243" is not valid.
从 modern date-time API 中了解有关 Trail: Date Time* 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。