我想对日期进行验证。日期有很多种格式: 欧美风格。此外,数字,快捷方式甚至月份全名。
我使用了Date.parse()
,但它不准确且有很多问题。例如:它没有注意闰年。另外,我添加了" 35/02/2008"没有给我任何例外。
我尝试了正则表达,但我发现的所有内容都存在问题。 它们都没有涵盖整个可能性。
请指教!
答案 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)
一旦我的应用程序是分析工具,输入可能会以不同的格式出现的问题。 如果我想通过分割日期手动完成,我必须创建一个完整的类,以检查所有不同格式的所有可能性。 这个问题没有完整的正则表达式。怎么样?