Java DateFormat.parse认为"100 112TH AVE NE"是一个日期

bob*_*alf 5 java date simpledateformat

我正在使用此处包含的代码来确定给定值是否为有效日期.在一个特定情况下,它正在评估以下街道地址:

100 112TH AVE NE

显然不是约会,但Java将其解释为:

太阳1月12日00:00:00 EST 100

有问题的代码:

String DATE_FORMAT = "yyyyMMdd";
try {
    DateFormat dfyyyyMMdd = new SimpleDateFormat(DATE_FORMAT);
    dfyyyyMMdd.setLenient(false);
    Date formattedDate;
    formattedDate = dfyyyyMMdd.parse(aValue);
    console.debug(String.format("%s = %s","formattedDate",formattedDate));
} catch (ParseException e) {
    // Not a date
}
Run Code Online (Sandbox Code Playgroud)

控制台返回:

11:41:40.063 DEBUG TestValues | formattedDate = Sun 1月12日00:00:00 EST 100

知道这里发生了什么吗?

Jon*_*oni 6

parse解析时,该方法不验证整个字符串是否被消耗; 你可以在有效的日期后随机垃圾,一切正常.在这种情况下,100 112可以成功解析为日期有点令人惊讶,但它可以.

您可以提供a ParsePosition来验证解析时是否消耗了整个字符串.

ParsePosition pos = new ParsePosition(0);
dfyyyyMMdd.parse(aValue, pos);
if (pos.getIndex() != aValue.length()) {
    // there's garbage at the end
}
Run Code Online (Sandbox Code Playgroud)

  • 当然,人们应该确保"过剩"不仅仅是空白. (2认同)