Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-验证给定字符串是否表示日期,即;YYYY-MM-DD“;?_Java_Validation_Date_Datetime - Fatal编程技术网

Java-验证给定字符串是否表示日期,即;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-

用户给我一个字符串,该字符串应表示到期日期,格式为“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-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我知道这并不完美,但用户如何进入这是一个版主,所以我没有执行严格的检查