【问题标题】:Check a date for different formats检查不同格式的日期
【发布时间】:2015-09-08 14:37:21
【问题描述】:

我试图找到一种优雅的方法来确定日期格式是否满足给定格式列表中的至少一个。具体来说,我必须根据这 3 种格式验证日期:YYYY、YYYY-MM 和 YYYY-MM-dd。

我尝试了在另一个线程中找到的示例,但它不起作用:

private boolean checkDateFormat( String dateString )
    {
        String[] possibleDateFormats = new String[] { "yyyy", "yyyy-MM", "yyyy-MM-dd" };

        boolean isValid = false;

        for ( String possibleDateFormat : possibleDateFormats )
        {
            try
            {
                SimpleDateFormat simpleDateFormant = new SimpleDateFormat( possibleDateFormat );
                simpleDateFormant.setLenient( false );
                simpleDateFormant.parse( dateString.trim() );
                isValid = true;
            }
            catch ( ParseException pe )
            {
            }
        }

        return isValid;
    }

另一种方法是使用正则表达式,但要涵盖所有可能性会相当复杂。

还有一种方法是解析字符串,分别检查年月日。像这样的:

String[] parts = dateString.split("-");
        boolean y = validateY(parts[0]);
        boolean m = parts.length>1 ? validateM(parts[1]) : true;
        boolean d = parts.length>2 ? validateD(parts[2]) : true;

        return y && m && d;

但我觉得它不是那么“优雅”。

其他想法?

示例(为什么代码 1 不起作用):

String[] possibleDates = new String[] { "999", "1001", "2001", "1", "123-3", "1234-13", "2015-12-31", "2015-13-31", "2015-12-32", "1-1-1" };

for (String date : possibleDates)
{
    System.out.println(date + " : " + checkDateFormat(date));
}

输出(有和没有中断):

999 : true
1001 : true
2001 : true
1 : true
123-3 : true
1234-13 : true     <- 13 months??
2015-12-31 : true
2015-13-31 : true  <- 13 months??
2015-12-32 : true  <- 32 days??
1-1-1 : true

Kartic 代码示例:

String[] possibleDateFormats = new String[] { "yyyy", "yyyy-MM", "yyyy-MM-dd" };
String[] possibleDates = new String[] { "999", "1001", "2001", "1", "123-3", "1234-13", "2015-12-31", "2015-13-31", "2015-12-32", "1-1-1", "0-00-0" };

boolean isDate = false;

for ( String date : possibleDates )
{
    for ( String strDate : possibleDateFormats )
    {
        isDate = isValidDate( date, strDate );
        if ( isDate )
        {
            break;
        }
    }
    System.out.println(date + " :- " + isDate);
}

输出是一样的……

【问题讨论】:

标签: java validation


【解决方案1】:

除了您的建议之外,我想不出任何其他选择。

我更喜欢第一个选项,因为它很简单,并且可以从外部资源轻松配置日期格式。

但是,您需要对代码进行少量更改,以使您的代码(第一个选项)能够完美运行。 即,如果日期验证成功,则在 for 循环中缺少 break 语句。

private boolean checkDateFormat( String dateString )
{
    String[] possibleDateFormats = new String[] { "yyyy", "yyyy-MM", "yyyy-MM-dd" };

    boolean isValid = false;

    for ( String possibleDateFormat : possibleDateFormats )
    {
        try
        {
            SimpleDateFormat simpleDateFormant = new SimpleDateFormat( possibleDateFormat );
            simpleDateFormant.setLenient( false );
            simpleDateFormant.parse( dateString.trim() );
            isValid = true;
            break;
        }
        catch ( ParseException pe )
        {
        }
    }

    return isValid;
}

【讨论】:

  • 查看我在问题中添加的示例。
【解决方案2】:

我尝试了 Joda Time 并且它有效:

private static boolean checkDateFormat( String dateString ) 
    {
        String[] possibleDateFormats = new String[] { "yyyy-MM-dd", "yyyy-MM", "yyyy"  };

        boolean isValid = false;

        for ( String possibleDateFormat : possibleDateFormats )
        {
            try
            {
                DateTimeFormatter fmt = DateTimeFormat.forPattern(possibleDateFormat);
                fmt.parseDateTime(dateString.trim());

                isValid = true;
            }
            catch ( Exception e )
            {
            }
        }

        return isValid;
    }

输出:

999 : true
1001 : true
2001 : true
1 : true
123-3 : true
1234-13 : false
2015-12-31 : true
2015-13-31 : false
2015-12-32 : false
1-1-1 : true
123-4-5 : true

【讨论】:

    【解决方案3】:

    我对您的代码进行了一些修改并对其进行了测试,对我来说工作正常。下面是更新后的代码,你能给我一个它不工作的例子吗(除了代码正在处理的一些不同格式的日期)

    检查有效日期的方法

    public static boolean isValidDate(final String strDate, final String dateFormat) {
    
        if (strDate == null || dateFormat == null) {
            return false;
        }
    
        SimpleDateFormat simpleDateFormant = new SimpleDateFormat(dateFormat);
        simpleDateFormant.setLenient(false);
    
        try {
            simpleDateFormant.parse(strDate.trim());
        } catch (ParseException e) {
            return false;
        }
    
        return true;
    }
    

    测试代码

    String[] possibleDateFormats = new String[] { "yyyy", "yyyy-MM", "yyyy-MM-dd" };
    String inputDate = "1999";
    boolean isDate = false;
    
    for (String strDate : possibleDateFormats) {
        isDate = isValidDate(inputDate, strDate);
        if(isDate) {
            break;
        }
    }
    
    System.out.println(isDate);
    

    【讨论】:

    • 查看我在问题中添加的示例。
    • 您是否认为,这是因为无论您输入什么格式,yyyy 格式的日期都是有效的?
    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多