只接受用户两到四位数的年份

时间:2015-04-24 00:36:56

标签: java

我必须通过简单的inputText字段(JSF 2)接受用户的日期。我创建了一个转换器,所以我可以验证日期,现在我遇到了1年,3年和5年以上的数字问题。用户输入的所有日期将是今天或将来(最多合理的最大值)。

以下解决方案接受三种不同的日期格式,并将正确处理2位和4位数年份(在前一种情况下,使用set2DigitYearStart将它们转换为20XX)。我完全不知道如何处理其他错误的日期。

代码

public static void main(String[] args) throws Exception {

    String date = "2/3/111"; // This should be rejected!

    List<String> datePatterns = new ArrayList<String>();
    datePatterns.add("MM-dd-yy");
    datePatterns.add("MM.dd.yy");
    datePatterns.add("MM/dd/yy");

    for (String pattern : datePatterns) {
        SimpleDateFormat formatter = new SimpleDateFormat(pattern);
        formatter.set2DigitYearStart(new SimpleDateFormat("MM/dd/yyyy").parse("1/1/2000"));
        formatter.setLenient(false);
        try {
            System.out.println(formatter.parse(date));
            break;
        } catch (ParseException ignore) {
            System.out.println("Date format doesn't match pattern: " + pattern);
        }
    }
}

应接受的例子

  • 02年2月2日
  • 2002年2月2日

应该被拒绝的例子

  • 02/02/1
  • 02/02/333
  • 02/02/55555

一种方法

获取一些理论上的maxDate和昨天的日期,然后比较输出。这似乎有点不对,但是......

        SimpleDateFormat f4 = new SimpleDateFormat("MM/dd/yyyy");
        Date maxDate = f4.parse("01/01/2099");

        DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        Date minDate = f4.parse(dateFormat.format(cal.getTime()));

1 个答案:

答案 0 :(得分:1)

在解析完成后添加一些特定的验证,以拒绝任何超出范围的年份,即getYear()&lt; 1000和getYear()&gt; 9999

警告此代码未在我在平板电脑上输入时进行编译或测试。

    String dateStr = "2/3/111"; // This should be rejected!

    List<String> datePatterns = new ArrayList<String>();
    datePatterns.add("MM-dd-yy");
    datePatterns.add("MM.dd.yy");
    datePatterns.add("MM/dd/yy");

    Date date = null;
    for (String pattern : datePatterns) {
        SimpleDateFormat formatter = new SimpleDateFormat(pattern);
        formatter.set2DigitYearStart(new SimpleDateFormat("MM/dd/yyyy").parse("1/1/2000"));
        formatter.setLenient(false);
        try {
            date = dateformatter.parse(dateStr));
            break;
        } catch (ParseException ignore) {
            continue;
        }
    }
    if (date != null) {
        Calendar cal =  new GregorianCalendar (date);
        int year = cal.get(Calendar.YEAR);
        if (year() < 1000 || year() > 9999) {
            System.out.println("Date format doesn't match pattern: " 
                 + datePatterns);
        }
    } else {
        System.out.println("Date format doesn't match pattern: " 
                 + datePatterns);
    {