Java中的完整日期验证

时间:2015-03-12 11:17:19

标签: java regex validation datetime

我想对日期进行验证。日期有很多种格式: 欧美风格。此外,数字,快捷方式甚至月份全名。

我使用了Date.parse(),但它不准确且有很多问题。例如:它没有注意闰年。另外,我添加了" 35/02/2008"没有给我任何例外。

我尝试了正则表达,但我发现的所有内容都存在问题。 它们都没有涵盖整个可能性。

请指教!

5 个答案:

答案 0 :(得分:1)

您应该查看Joda Time库:http://www.joda.org/joda-time/userguide.html#Input_and_Output

例如,您可以创建DateTimeFormatter,并使用它解析一些文本:

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMdd");
DateTime dt = fmt.parseDateTime(strInputDateTime);

该库允许构建复杂的日期时间模式,并且具有闰年等知识。

答案 1 :(得分:1)

除非您针对特定日期格式或(精心选择的)格式集进行验证,否则日期验证没有意义。为了说明,请考虑以下事项:

    23/11/77

这是一个有效的日期吗?这取决于!

  • 如果你要对" dd / MM / YY"进行验证,那么它是有效的。

  • 如果您要对" MM / dd / YY"进行验证,那么不,它不是。

  • 如果您要对" dd / MM / YYYY"进行验证,那么它是有效的,但它并不代表您认为的含义。

简而言之,确认"任何日期"无论格式如何都没有意义。上述日期可能有效或无效,可能意味着不同的事情。

人们知道"这些日期意味着什么令人担忧。事实上,当大多数人看到约会时,他们会根据自己的文化规范来解释...如果没有指定/同意这种格式,就不会发现大多数约会都是含糊不清

答案 2 :(得分:0)

如果您不想(或不允许)使用第三方库并希望手动控制验证,请使用" /"拆分字符串。作为分隔符,然后为所有需要的案例制定条件:

String pattern = "yyyy/MM/dd";
DateFormat df = new SimpleDateFormat(pattern);
String strDate = df.format(date);
String[] arrDate = strDate.split("/");

int year = Integer.parseInt(arrDate[0]);
int month = Integer.parseInt(arrDate[1]);
int day = Integer.parseInt(arrDate[2]);

if (month == 2 && day > 28) {
    System.out.println("February has 28 days!");
}
// etc ...

答案 3 :(得分:0)

如果您使用的是Java 8,那么您不需要joda。类似于UTC的内置API LocalDateTime也有一个API。

答案 4 :(得分:0)

一旦我的应用程序是分析工具,输入可能会以不同的格式出现的问题。 如果我想通过分割日期手动完成,我必须创建一个完整的类,以检查所有不同格式的所有可能性。 这个问题没有完整的正则表达式。怎么样?