Java:根据需要的格式检查当前字符串的日期格式

时间:2013-11-27 01:56:22

标签: java date

我想知道 Java 中是否有任何方法可以执行此操作。否则我可以使用Regex解决方案。

我有来自用户的输入字符串,可以是任何字符。我想检查输入字符串是否符合我所需的日期格式。

由于我已输入 20130925 ,我所需的格式为 dd / MM / yyyy 所以,对于这种情况,我应该 false

我不想转换这个日期我只想检查输入字符串是否符合所需的日期格式。



我试过了

Date date = null;
try {
date = new SimpleDateFormat("dd/MM/yyyy").parse("20130925");
} catch (Exception ex) {
// do something for invalid dateformat
}

但是我的catch(Exception ex)块无法捕获SimpleDateFormat.Parse()生成的任何异常;

8 个答案:

答案 0 :(得分:86)

声明

以未知格式解析字符串的日期/时间值本来就是不可能的(让我们面对它,3/3/3实际意味着什么?!),我们所能做的就是“尽力而为”

重要

此解决方案抛出Exception,它返回boolean,这是设计使然。任何Exception都纯粹用作防护机制。

2018

因为现在是2018年,Java 8+有日期/时间API(其余的都有ThreeTen backport)。解决方案基本保持不变,但稍微复杂一些,因为我们需要执行检查:

  • 日期和时间
  • 仅限日期
  • 仅限时间

这使它看起来像......

public static boolean isValidFormat(String format, String value, Locale locale) {
    LocalDateTime ldt = null;
    DateTimeFormatter fomatter = DateTimeFormatter.ofPattern(format, locale);

    try {
        ldt = LocalDateTime.parse(value, fomatter);
        String result = ldt.format(fomatter);
        return result.equals(value);
    } catch (DateTimeParseException e) {
        try {
            LocalDate ld = LocalDate.parse(value, fomatter);
            String result = ld.format(fomatter);
            return result.equals(value);
        } catch (DateTimeParseException exp) {
            try {
                LocalTime lt = LocalTime.parse(value, fomatter);
                String result = lt.format(fomatter);
                return result.equals(value);
            } catch (DateTimeParseException e2) {
                // Debugging purposes
                //e2.printStackTrace();
            }
        }
    }

    return false;
}

这使得以下内容......

System.out.println("isValid - dd/MM/yyyy with 20130925 = " + isValidFormat("dd/MM/yyyy", "20130925", Locale.ENGLISH));
System.out.println("isValid - dd/MM/yyyy with 25/09/2013 = " + isValidFormat("dd/MM/yyyy", "25/09/2013", Locale.ENGLISH));
System.out.println("isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = " + isValidFormat("dd/MM/yyyy", "25/09/2013  12:13:50", Locale.ENGLISH));
System.out.println("isValid - yyyy-MM-dd with 2017-18--15 = " + isValidFormat("yyyy-MM-dd", "2017-18--15", Locale.ENGLISH));

...输出

isValid - dd/MM/yyyy with 20130925 = false
isValid - dd/MM/yyyy with 25/09/2013 = true
isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = false
isValid - yyyy-MM-dd with 2017-18--15 = false

原始答案

使用类似String

之类的内容,轻松尝试将Date解析为所需的SimpleDateFormat
Date date = null;
try {
    SimpleDateFormat sdf = new SimpleDateFormat(format);
    date = sdf.parse(value);
    if (!value.equals(sdf.format(date))) {
        date = null;
    }
} catch (ParseException ex) {
    ex.printStackTrace();
}
if (date == null) {
    // Invalid date format
} else {
    // Valid date format
}

然后您可以简单地编写一个执行此操作的简单方法,并在true不为空时返回Date ...

作为建议......

更新了正在运行的示例

我不确定你在做什么,但是,以下例子......

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TestDateParser {

    public static void main(String[] args) {
        System.out.println("isValid - dd/MM/yyyy with 20130925 = " + isValidFormat("dd/MM/yyyy", "20130925"));
        System.out.println("isValid - dd/MM/yyyy with 25/09/2013 = " + isValidFormat("dd/MM/yyyy", "25/09/2013"));
        System.out.println("isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = " + isValidFormat("dd/MM/yyyy", "25/09/2013  12:13:50"));
    }

    public static boolean isValidFormat(String format, String value) {
        Date date = null;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            date = sdf.parse(value);
            if (!value.equals(sdf.format(date))) {
                date = null;
            }
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
        return date != null;
    }

}

输出(类似的东西)......

java.text.ParseException: Unparseable date: "20130925"
isValid - dd/MM/yyyy with 20130925 = false
isValid - dd/MM/yyyy with 25/09/2013 = true
isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = false
    at java.text.DateFormat.parse(DateFormat.java:366)
    at javaapplication373.JavaApplication373.isValidFormat(JavaApplication373.java:28)
    at javaapplication373.JavaApplication373.main(JavaApplication373.java:19)
  

不正确。对于isValidFormat(“yyyy-MM-dd”,“2017-18--15”);不抛出任何异常。

isValid - yyyy-MM-dd", "2017-18--15 = false

似乎按照我的预期工作 - 该方法不依赖于(也不会抛出)异常来执行它的操作

答案 1 :(得分:26)

对于您的情况,您可以使用正则表达式:

boolean checkFormat;

if (input.matches("([0-9]{2})/([0-9]{2})/([0-9]{4})"))
    checkFormat=true;
else
   checkFormat=false;

如果您需要更灵活的解决方案,请参阅MadProgrammer's answer。

修改

发布此答案差不多5年后,我意识到这是一种验证日期格式的愚蠢方法。但我会在这里留下这个告诉人们使用正则表达式验证日期是不可接受的

答案 2 :(得分:17)

您可以尝试使用简单的日期格式验证

 public Date validateDateFormat(String dateToValdate) {

    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HHmmss");
    //To make strict date format validation
    formatter.setLenient(false);
    Date parsedDate = null;
    try {
        parsedDate = formatter.parse(dateToValdate);
        System.out.println("++validated DATE TIME ++"+formatter.format(parsedDate));

    } catch (ParseException e) {
        //Handle exception
    }
    return parsedDate;
}

答案 3 :(得分:9)

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
formatter.setLenient(false);
try {
    Date date= formatter.parse("02/03/2010");
} catch (ParseException e) {
    //If input date is in different format or invalid.
}

formatter.setLenient(false)将强制执行严格匹配。

如果您使用的是Joda-Time -

private boolean isValidDate(String dateOfBirth) {
        boolean valid = true;
        try {
            DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy");
            DateTime dob = formatter.parseDateTime(dateOfBirth);
        } catch (Exception e) {
            valid = false;
        }
        return valid;
    }

答案 4 :(得分:0)

我相信正则表达式和SimpleDateFormat的组合是正确的答案。如果各个组件无效,SimpleDateFormat不会捕获异常, 格式定义:yyyy-mm-dd 输入:201-0-12 不会抛出异常。这个案子应该已经处理完了。 但正如Sok Pomaranczowy和Baby所建议的正则表达式将照顾这个特殊情况。

答案 5 :(得分:0)

这是一个简单的方法:

public static boolean checkDatePattern(String padrao, String data) {
    try {
        SimpleDateFormat format = new SimpleDateFormat(padrao, LocaleUtils.DEFAULT_LOCALE);
        format.parse(data);
        return true;
    } catch (ParseException e) {
        return false;
    }
}

答案 6 :(得分:0)

例如,如果您希望日期格式为" 03.11.2017"

 if (String.valueOf(DateEdit.getText()).matches("([1-9]{1}|[0]{1}[1-9]{1}|[1]{1}[0-9]{1}|[2]{1}[0-9]{1}|[3]{1}[0-1]{1})" +
           "([.]{1})" +
           "([0]{1}[1-9]{1}|[1]{1}[0-2]{1}|[1-9]{1})" +
           "([.]{1})" +
           "([20]{2}[0-9]{2})"))
           checkFormat=true;
 else
           checkFormat=false;

 if (!checkFormat) {
 Toast.makeText(getApplicationContext(), "incorrect date format! Ex.23.06.2016", Toast.LENGTH_SHORT).show();
                }

答案 7 :(得分:-1)

可以使用正则表达式以及一些详细的验证信息,例如,此代码可用于验证(DD / MM / yyyy)格式的任何日期,具有正确的日期和月份值以及(1950-2050)之间的年份

    public Boolean checkDateformat(String dateToCheck){   
        String rex="([0]{1}[1-9]{1}|[1-2]{1}[0-9]{1}|[3]{1}[0-1]{1})+
        \/([0]{1}[1-9]{1}|[1]{1}[0-2]{2})+
        \/([1]{1}[9]{1}[5-9]{1}[0-9]{1}|[2]{1}[0]{1}([0-4]{1}+
        [0-9]{1}|[5]{1}[0]{1}))";

        return(dateToCheck.matches(rex));
    }