我正在使用以下代码验证日期。代码在几天和几个月内正常工作,但它接受超过5位数的年份值,但是我已指定的格式" yyyy"。
问题:为什么它会在21114的情况下返回 true ,因为它不是我指定格式的有效日期。?
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class raju {
public static void main(String[] args) {
boolean a=raju.isThisDateValid("12/12/21114","MM/dd/yyyy");
System.out.println(a);
}
public static boolean isThisDateValid(String dateToValidate, String dateFromat){
if(dateToValidate == null){
return false;
}
SimpleDateFormat sdf = new SimpleDateFormat(dateFromat);
sdf.setLenient(false);
try {
//if not valid, it will throw ParseException
Date date = sdf.parse(dateToValidate);
System.out.println(date);
} catch (ParseException e) {
e.printStackTrace();
return false;
}
return true;
}
}
答案 0 :(得分:2)
来自SimpleDateFormat javadoc,
否则,将应用特定于日历系统的表单。对于格式化和解析,如果模式字母的数量是4或更多,则使用日历特定的长形式。否则,将使用日历特定的简短或缩写形式。
对于您似乎想要的行为,您需要检查年份是否小于10000.
答案 1 :(得分:1)
用于解析的格式更多地是关于组件和分隔符的顺序。
我希望不要介意输入在日期或月份中是否省略前导0,即使它明确表示期望2位数。所以这一年也不是严格的数字计数。
在实践中,如果您想检查年份是否有效,您需要再做一步。毕竟在大多数应用程序甚至9999年都没有意义。所以,如果你允许那么为什么不是10k?
<强>除了强>
Java符合Y10k标准。实际上它是Y1,000,000 complient。它不会解析1/1/10000000(1000万)!
答案 2 :(得分:1)
查看文档,似乎如果未提供您指定的确切位数,则按字面处理该值。
例如:
传入12的“yyyy”将成功解析为12 A.D.(而非2012年) 传入21114的“yyyy”将成功解析为21114 A.D。答案 3 :(得分:1)
由于您使用的parse(String)
类的DateFormat
方法由SimpleDateFormat
扩展,因此javadoc of parse method读取的内容为:
从给定字符串的开头解析文本以生成日期。 该方法可能不会使用给定字符串的整个文本。
parse(String,ParsePosition)
的javadoc读取:
默认情况下,解析是宽松的:如果输入不是此对象的格式方法使用的形式,但仍可以解析为日期,则解析成功。客户可以通过致电
setLenient(false)
坚持严格遵守格式。此解析操作使用日历生成日期。因此,日历的日期时间字段和TimeZone值可能已被覆盖,具体取决于子类实现。之前通过调用setTimeZone设置的任何TimeZone值可能需要恢复以进行进一步操作。
答案 4 :(得分:0)
问题在于日期在java中的运行方式,21114是根据java格式为YYYY的有效年份。正如它已经很好地被Westos和bstar55所展示,关于java和日期格式。解决方案可能是添加您自己的验证,以确保日期格式是您需要的方式。例如,如果您需要日期类似于此dd(不超过2位数),月份(不超过2位数)和年份(不超过4位数)
public static void main(String[] args) {
boolean a= isThisDateValid("12/12/21114","MM/dd/yyyy");
System.out.println(a);
}
public static boolean isThisDateValid(String dateToValidate, String dateFromat){
if(dateToValidate == null){
return false;
}
SimpleDateFormat sdf = new SimpleDateFormat(dateFromat);
sdf.setLenient(false);
String[] Arr=dateToValidate.split("/");
try {
if(Arr[0].length()>2 || Arr[1].length()>2 || Arr[2].length()>4){
throw new ParseException("Error in date: "+dateToValidate,0);
}
//if not valid, it will throw ParseException
Date date = sdf.parse(dateToValidate);
System.out.println(date);
} catch (ParseException e) {
e.printStackTrace();
return false;
}
return true;
}