验证简单的时间日期格式? (YYYY-MM-dd'T'HH:MM:SS)

时间:2014-09-17 07:07:03

标签: java simpledateformat

我将验证一个简单的时间日期格式(yyyy-MM-dd'T'HH:mm:ss),如下所示。这个实现适用于大多数主要验证,但不知何故,我发现一些验证似乎并没有起作用。 例如,如果您输入2014-09-11T03:27:54kanmsdklnasd2014-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;
}

3 个答案:

答案 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)

java.time

旧的日期时间 API(java.util 日期时间类型及其格式 API,SimpleDateFormat)已经过时且容易出错。建议完全停止使用,改用java.timemodern 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 desugaringHow to use ThreeTenABP in Android Project