Java-验证给定字符串是否表示日期,即;YYYY-MM-DD“;?
用户给我一个字符串,该字符串应表示到期日期,格式为“yyyy-mm-dd” 我想确认这是否是一个日期,我就是这样做的:Java-验证给定字符串是否表示日期,即;YYYY-MM-DD“;?,java,validation,date,datetime,Java,Validation,Date,Datetime,用户给我一个字符串,该字符串应表示到期日期,格式为“yyyy-mm-dd” 我想确认这是否是一个日期,我就是这样做的: try { DateFormat df = new SimpleDateFormat("yyyy-mm-dd"); System.out.println("Validating " + date + " as date"); df.parse(date); } catch (ParseException ex) { // not yyyy-
try {
DateFormat df = new SimpleDateFormat("yyyy-mm-dd");
System.out.println("Validating " + date + " as date");
df.parse(date);
}
catch (ParseException ex) {
// not yyyy-mm-dd date.
System.out.println(": Bad");
out.println(date + " cannot be parsed as a date. format: yyyy-mm-dd.");
return;
}
如果用户给我“2014-02-02gy”
然后打印:“验证2014-02-02gy.截止日期”
i、 e.未引发异常
为什么??我如何验证日期?提前谢谢
编辑:使用正则表达式作为建议之一:
if (!date.matches("\\d{4}-\\d{2}-\\d{2}") {
out.println("Not a date");
}
注意
simpleDataFormat#parse(string)
的javadoc,它说
该方法不能使用给定字符串的整个文本
我不相信您能够以这种方式验证
字符串末尾的字符。请注意,日期是有效的。您只需要检查字符串是否与某个模式匹配。您始终可以使用一种格式来反向解析,以查看您最终得到的是否是您最初得到的
DateFormat df = new SimpleDateFormat("yyyy-mm-dd");
String after = df.format(df.parse(date));
if (after.equals(date)) {
// validated
}
从DateFormat.parse的文档
* Parses text from the beginning of the given string to produce a date.
* The method may not use the entire text of the given string.
* <p>
* See the {@link #parse(String, ParsePosition)} method for more information
* on date parsing.
*
* @param source A <code>String</code> whose beginning should be parsed.
* @return A <code>Date</code> parsed from the string.
* @exception ParseException if the beginning of the specified string
* cannot be parsed.
“如果无法分析指定字符串的开头。”-它将从开头开始分析,直到获得所需的日期。因此,gy
将从您展示的示例中删除
要修复:
String date = "2014-02-02gy";
try {
DateFormat df = new SimpleDateFormat("yyyy-mm-dd");
System.out.println("Validating " + date + " as date");
Date dateObject = df.parse(date);
if(!df.format(dateObject).equals(date))
throw new ParseException(date, 0);
} catch (ParseException ex) { // not yyyy-mm-dd date.
System.out.println(": Bad");
System.out.println(date + " cannot be parsed as a date. format: yyyy-mm-dd.");
return;
}
我使用以下正则表达式来验证日期:
if(!date.matches("\\d{4}-\\d{2}-\\d{2}") {
out.println("Not a date");
}
感谢所有评论或回答的人:)如果您没有承诺使用Java标准库,请查看。这个库比标准的Java日期要进化得多。您的案例代码变得简单明了:
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
...
try {
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
System.out.println("Validating " + date + " as date");
formatter.parseDateTime(date);
} catch (IllegalArgumentException e) {
System.out.println(": Bad");
System.out.println(date + " cannot be parsed as a date. format: yyyy-mm-dd.");
return;
}
...
另一方面,如果你必须坚持使用标准Java,我会选择or解决方案(这大致相当于我对Chris的偏好,但这是我个人的喜好)。由于DateFormat奇怪地只匹配字符串的开头(对我来说似乎是个bug,但有文档记录,很好……),我会显式地添加一个结束分隔符,像这样
DateFormat df = new SimpleDateFormat("yyyy-mm-dd,");
String date = "2014-02-02,";
System.out.println("Validating " + date + " as date");
df.parse(date);
如果它遵循严格的格式(yyyy-mm-dd),我想您可以使用正则表达式进行快速有效性测试。请注意,月份是M
。您可以使用正则表达式:“2014-02-02”。匹配(\\d{4}-\\d{2}-\\d{2}”)
,但对于类似于“2013-31-31”的内容,也可以使用正则表达式
。如果你能解析出一个明确的日期,为什么还要在意是否有多余的垃圾呢?@Jaxo我不确定-但我不在乎;-)好,相关评论。那么如何解决这个问题呢?这种行为是否受到“设置宽松”的影响?@user2864740似乎不是这样。不是使用SimpleDateFormat
@naRendition,我的意思是,将lenient flag设置为false
不会改变尾随字符被忽略的事实。如果您想处理日期,请尝试使用jodatime库。请注意这一点,因为它允许像“2012-13-01”这样的日期,事实上会转换为“2013-01-01”@mardavi我知道这并不完美,但用户如何进入这是一个版主,所以我没有执行严格的检查